32

我需要我的 JTable 自动调整其列宽以适应内容。我发现这TableColumnAdjuster门课很有用。但是有一个小问题。假设我有 5 列,它们的内容很短。在这种情况下,如果我使用自动调整器,它会根据它们的内容设置前四列的宽度,并将所有剩余空间留给最后一列。请参阅示例。

在此处输入图像描述

这里的最后一列,Balance给出了所有多余的空间。但是,如果我需要将该空间留给中间列之一怎么办。在上述情况下,我需要将该空间分配给第三列,name. 我尝试修改TableColumnAdjuster类的adjustColumns()方法。但我无法让它工作。

我尝试了column.setPreferredWidth()column.setWidth()更改列大小。但似乎并没有改变什么。如何有效地更改JTable. 如果我的主要问题有其他选择或直接答案,那就更好了。谢谢!

4

4 回答 4

69

你可以试试下一个:

public void resizeColumnWidth(JTable table) {
    final TableColumnModel columnModel = table.getColumnModel();
    for (int column = 0; column < table.getColumnCount(); column++) {
        int width = 15; // Min width
        for (int row = 0; row < table.getRowCount(); row++) {
            TableCellRenderer renderer = table.getCellRenderer(row, column);
            Component comp = table.prepareRenderer(renderer, row, column);
            width = Math.max(comp.getPreferredSize().width +1 , width);
        }
        if(width > 300)
            width=300;
        columnModel.getColumn(column).setPreferredWidth(width);
    }
}

表

这需要在 resize 方法之前执行。
如果你有:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

表

于 2013-07-13T06:09:01.850 回答
4

没有选项可以自动调整一列大于另一列的大小。

也许你可以这样:

tca = new TableColumnAdjuster( table, 0 );
tca.adjustColumns();
TableColumnModel tcm = table.getColumnModel();  
TableColumn tc = tcm.getColumn(1);
tc.setWidth(tc.getWidth() + 25);

这将允许您向第 1 列添加额外的空间。这个额外的空间只会在第一次显示表格时添加。

另一种选择是使用:

table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

这将按比例为每一列分配额外的空间。

于 2013-07-13T15:41:08.373 回答
4

setAutoResizeMode()将告诉您的表格如何调整大小,您应该尝试一下所有不同的选项可以查看差异,在我的情况下,我想专门调整两列的大小并让它决定如何调整所有其他列。

jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
TableColumnModel colModel=jTable1.getColumnModel();
colModel.getColumn(1).setPreferredWidth(25);    
colModel.getColumn(2).setPreferredWidth(400);
于 2017-04-08T22:43:54.670 回答
1

你可以这样做:

JPanel jp = new JPanel();
jp.add(table);

jp.setLayout(new GridLayout(1,1)); /* little trick ;) and believe me that this step is important to the automatic all columns resize! A import is also needed for using GridLayout*/
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); // this is obvius part
于 2014-09-18T09:45:53.950 回答