2013-07-13 263 views
18

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

enter image description here

这里的最后一列,Balance给出所有的多余空间。但是如果我需要把这个空间放到中间一列的话。在上述情况下,我需要将该空间分配给第三列name。我尝试修改TableColumnAdjuster类的adjustColumns()方法。但我无法得到它的工作。

我尝试使用column.setPreferredWidth()column.setWidth()来更改列大小。但似乎并没有改变任何东西。如何有效更改JTable的列大小。如果还有一些其他的选择或直接回答我的主要问题,那就更好了。谢谢!

回答

43

你可以尝试下:

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

+0

这太棒了,最终使用它。我在setPreferredColumnModel调用之前添加了一个检查,看起来像“if(width> 300)width = 300;”它修复了一些我正在显示非常长的数据字段的情况。我建议在答案中加入 - 你也许还会提取出最小/最大宽度(会做出很好的可选参数 - 事实上我现在要在我的代码库中这样做)。(我希望我知道当编辑这样的东西到别人的回答中很酷时......由于它不是CW,所以我不希望在未经许可的情况下更改内容。) –

+0

嗨,@BillK随意编辑/添加代码...并且如果有的话,截图。 ;) –

+0

我也可以以某种方式评估标题,以便其文本不会被截断? – Xerus

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

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

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 
+0

不适用...... – Augusto

1

setAutoResizeMode()会告诉你的表如何调整你应该给它一个尝试将可看到不同的所有不同的选择,在我的情况,我想特别调整两列的大小,让它决定如何调整所有其他列。

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