2011-04-28 59 views
11

我有一個JTable將最後一列數據字段更改爲不同的字符串值。我想調整列的字符串長度。字符串長度到寬度的公式是什麼?如何將JTable列調整爲字符串長度?

我將使用JTable.getColumnModel().getColumn().setPreferredWidth(),所以我想知道如何字符串長度轉換爲寬度值。

回答

15

你是不是在字符串的長度(也沒有了它映射到一個特定的字體/度量)真正感興趣。您對renderers單元格內容的renderingComponent的preferredSize感興趣。要獲取,遍歷所有行和查詢的大小,類似

int width = 0; 
for (row = 0; row < table.getRowCount(); row++) { 
    TableCellRenderer renderer = table.getCellRenderer(row, myColumn); 
    Component comp = table.prepareRenderer(renderer, row, myColumn); 
    width = Math.max (comp.getPreferredSize().width, width); 
} 

或使用JXTable(在SwingX項目):它具有不爲你工作的方法包():-)

編輯:在渲染器上手動調用getXXRendererComponent時,更喜歡錶的prepareRenderer的原因是該表可能會裝飾renderingComponent的視覺屬性。如果這些裝飾效果會影響組件的prefSize,則手動配置將關閉。

+0

的tableColumn.getWidth()= tableColumn.getPreferredWidth()頭 - 前財產!實際寬度,而後者是列想要得到的。根據JTable的autoResizeMode,列將被擠壓/展開以適應視口。嘗試table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF)。大多數情況下,這會顯示一個scrollBar(該表在JScrollPane中,對嗎?),並且列寬與prefWidth – kleopatra 2011-04-28 15:06:43

+0

相同很好的答案,當我發現這個問題時,我只是用字符串長度來實現這個邏輯。但是你是否也有一個想法如何考慮列名的長度呢? – 2013-05-13 14:25:32

+0

好了,才發現,有一個方法,'getHeaderRenderer()' – 2013-05-13 14:37:07

5

此方法將在一個JTable包一個給定的列 -

/** 
* Sets the preferred width of the visible column specified by vColIndex. The column 
* will be just wide enough to show the column head and the widest cell in the column. 
* margin pixels are added to the left and right 
* (resulting in an additional width of 2*margin pixels). 
*/ 
public static void packColumn(JTable table, int vColIndex, int margin) { 
    DefaultTableColumnModel colModel = (DefaultTableColumnModel)table.getColumnModel(); 
    TableColumn col = colModel.getColumn(vColIndex); 
    int width = 0; 

    // Get width of column header 
    TableCellRenderer renderer = col.getHeaderRenderer(); 
    if (renderer == null) { 
     renderer = table.getTableHeader().getDefaultRenderer(); 
    } 
    java.awt.Component comp = renderer.getTableCellRendererComponent(
     table, col.getHeaderValue(), false, false, 0, 0); 
    width = comp.getPreferredSize().width; 

    // Get maximum width of column data 
    for (int r=0; r<table.getRowCount(); r++) { 
     renderer = table.getCellRenderer(r, vColIndex); 
     comp = renderer.getTableCellRendererComponent(
      table, table.getValueAt(r, vColIndex), false, false, r, vColIndex); 
     width = Math.max(width, comp.getPreferredSize().width); 
    } 

    // Add margin 
    width += 2*margin; 

    // Set the width 
    col.setPreferredWidth(width); 
} 
+0

偷懶:JTable有一個方法prepareRenderer - 讓那個做的工作,而不是手動準備 – kleopatra 2011-04-28 14:46:03

+0

+1包括確定列寬 – amaidment 2012-04-23 10:04:39

4

Table Column Adjuster工程靜態和動態和用戶可以控制這一點。

+0

只是強調,從上述重複我的評論:偷懶:JTable有一個方法prepareRenderer - 讓那個做的,而不是準備手動 – kleopatra 2011-04-28 14:56:11

+0

@kleopatra工作,謝謝爲了指出珍妮特。通常我很懶。其他博客在我的博客中使用這種方法。不知道爲什麼我這次沒有使用prepareRender()方法:) – camickr 2011-04-28 15:28:09

相關問題