这应该很容易解决,但我只是看不到它。以下JPanel只包含一个ScrollPane(包含一个表)和一个Button。
我需要知道表的实际列宽。 单击该按钮确实显示正确的值,但内部调用只为每列输出75(默认值)。如何在此处的代码中获得正确的结果?
public MyPanel() { //JPanel
setLayout(new BorderLayout());
this.setBounds(0, 0, 1000, 250);
table = new JTable(5,6);
JScrollPane sp = new JScrollPane(table);
this.add(sp, BorderLayout.CENTER);
JButton b = new JButton("Test");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
displayWidths(); //DOES WORK!
}
});
this.add(b, BorderLayout.SOUTH);
displayWidths(); //DOES NOT WORK!
}
private void displayWidths() {
for (int i = 0; i < table.getColumnCount(); i++) {
TableColumn column = table.getColumnModel().getColumn(i);
System.out.println("Width of column " + i + " : " + column.getWidth());
}
}
答案 0 :(得分:1)
来自按钮的调用有效,因为您的面板/表已实现(在屏幕上可见)。内联版本没有,因为您的表尚未实现。
修改强>
现在使用经过测试的代码:
public class TestGetColumnWidths {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Columns");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
final JTable table = new JTable(5, 6);
table.getTableHeader().addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
super.componentResized(e);
displayColumnWidths(table.getTableHeader());
}
});
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JScrollPane(table));
frame.add(panel);
//frame.pack();
frame.setSize(1000, 250);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private void displayColumnWidths(JTableHeader header) {
TableColumnModel model = header.getColumnModel();
for (int i = 0; i < model.getColumnCount(); i++) {
TableColumn column = model.getColumn(i);
System.err.println("column.getWidth(): " + column.getWidth());
}
}
});
}
}