2013-07-13 158 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);