【发布时间】:2015-10-02 06:49:48
【问题描述】:
我设计了两个具有相同 columnmodel 的 jtable,因此它们相应地调整大小,这两个 jtable 应该具有相同的列号,我希望它们在我们调整列大小或更改滚动条时以相同的方式表现。现在我有一个问题,当我调整第二个表的大小时,行上的列不会改变它们的大小,滚动条也不会相应地表现出来。
我的代码是这样的
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;
public class CompFilteredTable extends JPanel{
private JTable tblFilter;
private JTable tblData;
private JScrollPane scrollPane;
private JScrollPane scrollPane_1;
public CompFilteredTable() {
setLayout(new BorderLayout(0, 0));
add(getScrollPane_1(), BorderLayout.NORTH);
add(getScrollPane(), BorderLayout.CENTER);
}
public JTable getTblFilter() {
if (tblFilter == null) {
tblFilter = new MyTable(new TestTableModel2());
tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setTableHeader (null);
}
return tblFilter;
}
public JTable getTblData() {
if (tblData == null) {
tblData = new MyTable(new TestTableModel());
tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setColumnModel(tblData.getColumnModel());
}
return tblData;
}
private class MyTable extends JTable {
private MyTable (final TableModel model) {
super (model);
}
private boolean isColumnMarginChangeInProgress=false;
@Override
public void columnMarginChanged(final ChangeEvent e) {
if (isColumnMarginChangeInProgress) {
return;
}
isColumnMarginChangeInProgress = true;
if (isEditing()) {
removeEditor();
}
TableColumn resizingColumn = null;
if (tableHeader != null) {
resizingColumn = tableHeader.getResizingColumn();
}
if (resizingColumn != null) {
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
} else { // this else block is missing in jdk1.4 as compared to 1.3
doLayout();
repaint();
}
} else {
resizeAndRepaint();
}
isColumnMarginChangeInProgress = false;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 400));
CompFilteredTable compFilteredTable = new CompFilteredTable();
frame.getContentPane().add(compFilteredTable);
frame.pack();
frame.setVisible(true);
}
private class TestTableModel extends DefaultTableModel {
@Override
public int getRowCount () {
return 10;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private class TestTableModel2 extends DefaultTableModel {
@Override
public int getRowCount () {
return 1;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setViewportView(getTblData());
}
return scrollPane;
}
private JScrollPane getScrollPane_1() {
if (scrollPane_1 == null) {
scrollPane_1 = new JScrollPane();
scrollPane_1.setViewportView(getTblFilter());
}
return scrollPane_1;
}
}
deepak 贡献后更新代码(我不知道如何显示我的更新,因此我在下面添加)
我更新了代码,现在在图片上看到了两个问题。第二个表的表头没有看到,表之间有很大的差距。
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;
import java.awt.GridLayout;
public class CompFilteredTable extends JPanel{
private JTable tblFilter;
private JTable tblData;
private JScrollPane scrollPane;
private JPanel panel;
public CompFilteredTable() {
setLayout(new BorderLayout(0, 0));
add(getScrollPane(), BorderLayout.CENTER);
}
public JTable getTblFilter() {
if (tblFilter == null) {
tblFilter = new MyTable(new TestTableModel2());
tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setTableHeader (null);
}
return tblFilter;
}
public JTable getTblData() {
if (tblData == null) {
tblData = new MyTable(new TestTableModel());
tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setColumnModel(tblData.getColumnModel());
}
return tblData;
}
private class MyTable extends JTable {
private MyTable (final TableModel model) {
super (model);
}
private boolean isColumnMarginChangeInProgress=false;
@Override
public void columnMarginChanged(final ChangeEvent e) {
if (isColumnMarginChangeInProgress) {
return;
}
isColumnMarginChangeInProgress = true;
if (isEditing()) {
removeEditor();
}
TableColumn resizingColumn = null;
if (tableHeader != null) {
resizingColumn = tableHeader.getResizingColumn();
}
if (resizingColumn != null) {
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
} else { // this else block is missing in jdk1.4 as compared to 1.3
doLayout();
}
repaint();
} else {
resizeAndRepaint();
}
isColumnMarginChangeInProgress = false;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 400));
CompFilteredTable compFilteredTable = new CompFilteredTable();
frame.getContentPane().add(compFilteredTable);
frame.pack();
frame.setVisible(true);
}
private class TestTableModel extends DefaultTableModel {
@Override
public int getRowCount () {
return 10;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private class TestTableModel2 extends DefaultTableModel {
@Override
public int getRowCount () {
return 1;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setViewportView(getPanel());
}
return scrollPane;
}
private JPanel getPanel() {
if (panel == null) {
panel = new JPanel();
panel.setLayout(new GridLayout(2, 1, 0, 0));
panel.add(getTblFilter());
panel.add(getTblData());
}
return panel;
}
}
输出画面
【问题讨论】:
标签: java swing jtable jpanel jscrollpane