TableColumnModelListener. JPanel revalidate()方法破坏了摆动元素的组成 [英] TableColumnModelListener. JPanel revalidate() method ruins swing elements composition
问题描述
问题描述:
最初有两个表:
在左表的顶部有两个元素:JTextField和JComboBox,它们被放在一个单独的JPanel中.这两个元素对于表筛选都是必需的,即更改选定的组合框元素或在左侧的JTextField get表中键入某些内容以过滤掉.
At the top of the left table there are two elements: JTextField and JComboBox, which are put into one separate JPanel. These two elementes are needed for the table filtering purposes, that is, changing selected combo box element or typing something in the JTextField get table on the left filtered out.
我试图实现TableColumnModelListener接口,以便将JTextField和JComboBox元素连接到表.结果并没有我预期的那么好:revalidate()方法调用JPanel容器对象uppon破坏了整个swing元素的组合.下图显示了该实验的结果:
I tried to implement TableColumnModelListener interface in order to connect JTextField and JComboBox elements to the table. The result was not so good as I expected: the revalidate() method called uppon the JPanel container object ruined whole swing elements composition. The outcome of this experiment is showed in the following picture:
源代码:
TablesTest类:
TablesTest class:
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class TablesTest {
private JFrame frame = new JFrame();
private javax.swing.JPanel commonTablesPanel;
private javax.swing.JPanel dataTable1Panel;
private javax.swing.JPanel dataTable2Panel;
private javax.swing.JTable datatable1Table;
private javax.swing.JTable datatable2Table;
private javax.swing.JComboBox filterComboBox;
private javax.swing.JPanel filterPanel;
private javax.swing.JTextField filterTextField;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private TableResizeListener tableResizeListener1;
public TablesTest() {
java.awt.GridBagConstraints gridBagConstraints;
commonTablesPanel = new javax.swing.JPanel();
dataTable1Panel = new javax.swing.JPanel();
filterPanel = new javax.swing.JPanel();
filterTextField = new javax.swing.JTextField();
filterComboBox = new javax.swing.JComboBox();
jScrollPane3 = new javax.swing.JScrollPane();
datatable1Table = new javax.swing.JTable();
dataTable2Panel = new javax.swing.JPanel();
jScrollPane4 = new javax.swing.JScrollPane();
datatable2Table = new javax.swing.JTable();
frame.setLayout(new java.awt.GridBagLayout());
commonTablesPanel.setMinimumSize(new java.awt.Dimension(30, 30));
commonTablesPanel.setPreferredSize(new java.awt.Dimension(30, 30));
commonTablesPanel.setLayout(new java.awt.GridBagLayout());
dataTable1Panel.setLayout(new java.awt.GridBagLayout());
filterPanel.setLayout(new java.awt.GridBagLayout());
filterTextField.setPreferredSize(new java.awt.Dimension(30, 20));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
filterPanel.add(filterTextField, gridBagConstraints);
filterComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
filterComboBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
//TODO
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
filterPanel.add(filterComboBox, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
dataTable1Panel.add(filterPanel, gridBagConstraints);
jScrollPane3.setPreferredSize(new java.awt.Dimension(30, 30));
datatable1Table.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null}
},
new String [] {
"Title 1", "Titile 2"
}
));
datatable1Table.setMinimumSize(new java.awt.Dimension(30, 30));
jScrollPane3.setViewportView(datatable1Table);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.weighty = 0.1;
dataTable1Panel.add(jScrollPane3, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.weighty = 0.1;
commonTablesPanel.add(dataTable1Panel, gridBagConstraints);
dataTable2Panel.setLayout(new java.awt.GridBagLayout());
jScrollPane4.setPreferredSize(new java.awt.Dimension(30, 30));
datatable2Table.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null},
{null, null}
},
new String [] {
"Titile 1", "Title 2"
}
) {
boolean[] canEdit = new boolean [] {
false, false
};
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
datatable2Table.setMinimumSize(new java.awt.Dimension(30, 30));
jScrollPane4.setViewportView(datatable2Table);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.weighty = 0.1;
dataTable2Panel.add(jScrollPane4, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.weighty = 0.1;
commonTablesPanel.add(dataTable2Panel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.weighty = 0.1;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 0, 4);
frame.add(commonTablesPanel, gridBagConstraints);
tableResizeListener1 = new TableResizeListener(datatable1Table, filterPanel);
frame.setPreferredSize(new Dimension(400,150));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TablesTest tableTest = new TablesTest();
}
});
}
}
通知
tableResizeListener1 = new TableResizeListener(datatable1Table, filterPanel);
部分.这是所有表列都连接到对应的JPanel元素(在此示例中为JTextField和JComboBox)的地方.如果要观察没有连接元素的构图的外观,可以注释掉该行.
part. This is where all table columns get connected to the corresponding JPanel elements (JTextField and JComboBox in this example). You can comment this line out if you want to observe how does the composition look like without connected elements.
TableResizeListener类.这就是问题所在.
TableResizeListener class. This is where the problem lurks.
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.table.TableColumnModel;
public class TableResizeListener implements TableColumnModelListener {
private static final long serialVersionUID = 1L;
private JTable table = null;
private JPanel filterRow = null;
public TableResizeListener(JTable table, JPanel filterRow) {
this.table = table;
this.filterRow = filterRow;
this.table.getColumnModel().addColumnModelListener(this);
columnMarginChanged(new ChangeEvent(table.getColumnModel()));
}
// Implement TableColumnModelListener methods
// (Note: instead of implementing a listener you should be able to
// override the columnMarginChanged and columMoved methods of JTable)
@Override
public void columnMarginChanged(ChangeEvent e) {
TableColumnModel tcm = table.getColumnModel();
int columns = tcm.getColumnCount();
if(columns == filterRow.getComponentCount()) {
for (int i = 0; i < columns; i++) {
Component comp = filterRow.getComponent(i);
Dimension d = comp.getPreferredSize();
d.width = tcm.getColumn(i).getWidth();
comp.setPreferredSize(d);
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
filterRow.revalidate();
}
});
}
}
@Override
public void columnMoved(TableColumnModelEvent e) {
Component moved = filterRow.getComponent(e.getFromIndex());
filterRow.remove(e.getFromIndex());
filterRow.add(moved, e.getToIndex());
filterRow.validate();
}
@Override
public void columnAdded(TableColumnModelEvent e) {
}
@Override
public void columnRemoved(TableColumnModelEvent e) {
}
@Override
public void columnSelectionChanged(ListSelectionEvent e) {
}
}
行
filterRow.revalidate();
负责此错误.我试图调用repaint(),validate(),但是它并没有带来如此流畅的视觉体验.
is responsible for this bug. I tried to call repaint(), validate(), however it resulted in not such a smooth visual experience.
如何在不破坏视觉外观的情况下将元素连接到JTable的外部?
How can I connect elements to the outside of the JTable without ruining my visual composition?
推荐答案
注释此行以解决您的问题.
Comment this line out to fix your problem.
jScrollPane4.setPreferredSize(new java.awt.Dimension(30, 30));
这篇关于TableColumnModelListener. JPanel revalidate()方法破坏了摆动元素的组成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!