2012-02-29 67 views
1
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f }; 

setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

for (int i = 0; i < cwidth.length; i++) { 
      getColumnModel().getColumn(i).setPreferredWidth((int) (getPreferredScrollableViewportSize().width * cwidth[i])); 
     } 

我有以下問題:設置TableColumn來的寬度動態

我有5列一個JTable。第一個是3位數字,第二個是字符串,然後是JProgressBar,另一個字符串和一個按鈕。

現在我希望他們有寬度取決於表的大小。在上面你可以看到我的實際嘗試,但這不起作用。

我已經搜索了網頁,但是我發現並沒有幫助我,因爲它總是將大小設置爲非動態大小。

我希望你能幫助我。

感謝您的幫助。我喜歡這一面!

這裏我的解決辦法:

for (int i = 0; i < cwidth.length; i++) { 
      getColumnModel().getColumn(i).setPreferredWidth((int) (600 * cwidth[i])); 
      getColumnModel().getColumn(i).setMinWidth((int) (100 * cwidth[i])); 
      getColumnModel().getColumn(i).setMaxWidth((int) (1000 * cwidth[i])); 
     } 

回答

2

干擾表的內部列布局(基本上,它是自己的佈局管理器,列爲「子」)並不是微不足道的。光明的一面:默認行爲並不壞,它已經有了合理的調整大小模式。默認的resizeAll最有可能做你想要的只是一個小的配置需要 - 這不是太intuitve :-)

首先,閱讀JTable.doLayout()的API文檔 - 它描述了確切的行爲。最重要的一點是要了解跨列的寬度如何過量分配:

deltaI = (excess) * ((maxI - prefI)/(maxAll - prefAll)) 

(帶後綴我表示了單個列和單個值,分別爲所有的總和),這是最大的個體差異的因素/ pref加上max/pref的總和。看起來像一個合理的決定,只是......默認最大值爲Integer.MAX,對於所有列,該因子大致相同,而不考慮它們的優先級。基本上,爲什麼調整大小顯得如此不直觀,以及爲什麼需要調整maxSize(就像@Lajos Arpad已經指出的:-)以獲得合理的默認調整大小行爲。的

因此,而不是試圖做自己動手(這是不是一個好主意,因爲總是與佈局管理),根據需要配置列屬性:

// start out with a reasonable pref size, f.i. from a prototype or 
// measuring the actual cell content (both supported by JXTable) 
forEachColumn 
    column.setPreferredWidth(....); 

// then configure the maxWidth proportionally 
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f }; 
forEachColumn 
    int max = ((int) (1000f * cwidth[columnExt.getModelIndex()])); 
    columnExt.setMaxWidth(max); 

注意,1000是一個任意神奇的數字,你可能想玩一點,它取決於屏幕分辨率和用戶期望

+1

+1太實用的方式,非常複雜,恐怕 – mKorbel 2012-02-29 12:54:15

+0

好的,謝謝我會盡力去看看會發生什麼,雖然我有類似的嘗試,但沒有幫助。 – NotANormalNerd 2012-02-29 13:48:03

2

如果首選寬度小於最小寬度大於最大寬度那麼你的列將不被首選寬度調整大小更小或更大。您還應該控制最小寬度和最大寬度,以保證您的首選寬度在它們之間。

此外,默認情況下,列會自動根據表大小更改調整大小,您也應該檢查自動調整大小模式。

+2

+1,但僅用於關閉AutoResize – mKorbel 2012-02-29 10:24:59

+0

我試過它有無最大和最小設置。有和沒有setAutoResize關閉。但是沒有辦法解決這個問題。有一個問題,我不能得到表的實際大小來計算正確的大小。 – NotANormalNerd 2012-02-29 11:56:29

+0

您是否使用JTable對象的getColumnModel()。getColumn(index)方法來訪問列對象? – 2012-02-29 13:10:05