table.getTableHeader().setResizingAllowed(false);
column = table.getColumn(columns[0]);
column.setWidth(25);
column = table.getColumn(columns[1]);
column.setWidth(225);
column = table.getColumn(columns[2]);
column.setWidth(50);
table.doLayout()
这拒绝将列设置为指定的宽度。有什么理由吗?
答案 0 :(得分:3)
当JTable
的调整大小模式不是AUTO_RESIZE_OFF
时,Swing会忽略您设置的列宽。
不使用setWidth
,而是使用setPreferredWidth
。然后,在布置列时,表将使用此值。如果设置最小,最大和首选宽度,它应适用于所有场合,但您的用户不能再自行更改列宽。所以请谨慎使用。
答案 1 :(得分:0)
为了让我的桌子工作,我覆盖setBounds
并在那里设置首选宽度:
@Override
public void setBounds(int x, int y, int width, int height)
{
super.setBounds(x, y, width, height);
setPreferredColumnWidths(new double[] { 0.4, 0.4, 0.1, 0.1 });
}
我从这个article获得了setPreferredColumnWidths的实现。
protected void setPreferredColumnWidths(double[] percentages)
{
Dimension tableDim = getPreferredSize();
double total = 0;
for (int i = 0; i < getColumnModel().getColumnCount(); i++)
{
total += percentages[i];
}
for (int i = 0; i < getColumnModel().getColumnCount(); i++)
{
TableColumn column = getColumnModel().getColumn(i);
column.setPreferredWidth(
(int)(tableDim.width * (percentages[i] / total)));
}
}
答案 2 :(得分:0)
我无法让这个工作多年,然后我终于发现我需要将autoCreateColumnsFromModel
设置为false。
编辑:忽略这一点,这是我想要tableDataChanged时触发tableStructureChanged的结果(请参阅下面的讨论,并感谢kleopatra识别错误)