我设计了两个具有相同列模型的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;
}
}
输出屏幕
最佳答案
使用 columnMarginChanged
事件中的 setPreferredWidth
方法设置 TableColumn
的首选宽度将更新 JTableHeader
成分。因此,正如观察到的那样,表头的大小正在调整。
设置所需属性后显式调用 repaint()
也会触发将更改应用于表的每个组件。
因此,要使其按照您的预期运行,需要进行以下更改。
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
repaint();
} else { // this else block is missing in jdk1.4 as compared to 1.3
此外,repaint()
也可以移出条件 block 。
关于java - 我如何创建两个具有相同Columnmodel但具有不同模型的Jtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32901874/