JTable列调整大小不起作用

时间:2009-06-25 20:19:01

标签: java swing resize jtable

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()

这拒绝将列设置为指定的宽度。有什么理由吗?

3 个答案:

答案 0 :(得分:3)

JTable的调整大小模式不是AUTO_RESIZE_OFF时,Swing会忽略您设置的列宽。 不使用setWidth,而是使用setPreferredWidth。然后,在布置列时,表将使用此值。如果设置最小,最大和首选宽度,它应适用于所有场合,但您的用户不能再自行更改列宽。所以请谨慎使用。

API-Docs

中详细介绍了布局过程

答案 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识别错误)