Java 自动调整JTable列宽的大小

Java 自动调整JTable列宽的大小,java,swing,jtable,tablecolumn,Java,Swing,Jtable,Tablecolumn,我需要我的JTable自动调整列宽以适应内容。我发现这门课很有用。但是有一个小问题。假设我有5个专栏,它们的内容很短。在这种情况下,如果我使用自动调整器,它会根据其内容设置前四列的宽度,并将所有剩余的空间提供给最后一列。请看这个例子 最后一列,Balance给出了所有多余的空间。但是如果我需要给中间的一列空间呢。在上述情况下,我需要将该空间分配给第三列,name。我试图修改tableColumnAdjustrator类的adjustColumns()方法。但我无法让它工作 我尝试了column

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

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

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

您可以尝试下一步:

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

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

也许你可以这样做:

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);
这将按比例为每列分配额外的空间。

您可以这样做:

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
setAutoResizeMode()将告诉您的表如何调整大小。您应该尝试使用所有不同的选项来查看差异,在我的例子中,我想专门调整两列的大小,并让它决定如何调整所有其他列

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

这真是太棒了,最后用上了。我在setPreferredColumnModel调用之前添加了一个类似于“if(width>300)width=300”的检查,它修复了一些显示很长数据字段的情况。我建议将其添加到答案中——你也可以提取出最小/最大宽度(这将是非常棒的可选参数——事实上,我现在要在我的代码库中这样做。)(我希望我知道什么时候将这样的内容编辑到别人的答案中是很酷的……因为这不是CW,我讨厌在未经允许的情况下更改内容。)嗨,@BillK可自由编辑/添加代码。。。如果有,请提供屏幕截图我是否也可以对标题进行求值,以便其文本不会被截断?@Xerus Add
width=Math.max(width,table.getColumnModel().getColumn(column.getPreferredWidth())在上面代码的第9行之后,用于计算标题。正如预期的那样,工作非常完美!
jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
TableColumnModel colModel=jTable1.getColumnModel();
colModel.getColumn(1).setPreferredWidth(25);    
colModel.getColumn(2).setPreferredWidth(400);