自动调整JTable列宽的大小

时间:2013-07-13 05:57:46

标签: java swing jtable tablecolumn

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

enter image description here

这里最后一列Balance给出了所有多余的空间。但是,如果我需要将该空间提供给其中一个中间列,该怎么办呢?在上面的例子中,我需要将该空间分配给第三列name。我尝试修改TableColumnAdjuster类的adjustColumns()方法。但我无法让它发挥作用。

我尝试了column.setPreferredWidth()column.setWidth()来更改列大小。但似乎它没有改变任何东西。如何有效地更改JTable的列大小。如果还有其他替代方案或直接回答我的主要问题,那就更好了。谢谢!

4 个答案:

答案 0 :(得分:53)

您可以尝试下一个:

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);
    }
}

JTable

这需要在调整大小方法之前执行。
如果你有:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

JTable

答案 1 :(得分:5)

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

也许你可以这样:

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

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

答案 2 :(得分:3)

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

jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
TableColumnModel colModel=jTable1.getColumnModel();
colModel.getColumn(1).setPreferredWidth(25);    
colModel.getColumn(2).setPreferredWidth(400);

答案 3 :(得分:0)

你可以这样做:

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