2011-03-29 44 views
0

我有一個JTable,其中包含5個在TableColumnModel中指定的列。我希望表格使用面板中的所有可用水平空間(可以改變),但我想限制調整大小到最後三行。如何從JTable中的自動調整大小排除列

更詳細地:

前兩列用的優選寬度初始化,但用戶應能夠通過使用鼠標拖動手動調整列。

最後三列應平分所有前兩列未使用的剩餘空間。編輯:他們也需要手動調整大小。

我試過以下內容: 將表設置爲autoResizeMode JTable.AUTO_RESIZE_ALL_COLUMNS。這在 中佔用了所有可用空間,但(顯然)它也調整了前兩列的大小。 我已經對此做出了反應,設置了前兩列的最小值和最大值。這工作, 但它違反了我的限制,讓他們手動調整大小。

JTable -API中有一個簡單的方法來實現這個嗎?

在此先感謝!

回答

1

正如托馬斯已經回答的那樣,沒有簡單的API來實現你想要的東西:你必須自己實現這個行爲。在一般情況下,這可能不是微不足道的,但在具體的情況下可以管理。只是爲了確保我明白你的要求正確:

A)2列可調整大小的用戶,3列不是由用戶調整大小(它們應該具有相同的寬度)

B),而用戶調整2個可調整大小的列之一,其他可調整大小的列應該保持其當前寬度,任何空間分佈應該僅影響3個不可調整大小的列,均勻地分配超出/缺失寬度。

基本上,訣竅是「修復」其他可調整大小的列的大小,同時調整其中一個大小。通過將其最小值/最大值設置爲首選值來實現「修復」。然後在AUTO_RESIZE_ALL_COLUMNS模式下,剩餘列的空間均勻分佈將自動發生。問題是檢測調整大小的開始/停止:JTableHeader有一個屬性resizingColumn,不幸的是在覈心中未被綁定(又名:不會觸發更改)。另一方面,SwingX(你已經猜到了我遲早會提到SwingX :-)將這個屬性提升爲一個完整的bean屬性 - 所以只需簡單地聽取並更新最小/最大大小約束即可。下面是使用SwingX

// custom ColumnFactory to configure the columns 
ColumnFactory factory = new ColumnFactory(){ 

    /** 
    * @inherited <p> 
    */ 
    @Override 
    public void configureTableColumn(TableModel model, 
      TableColumnExt columnExt) { 
     super.configureTableColumn(model, columnExt); 
     columnExt.setResizable(columnExt.getModelIndex() < 2); 
     if (columnExt.getModelIndex() >= 2) { 
      columnExt.setPreferredWidth(50); 
     } else { 
      columnExt.setPreferredWidth(150); 
     } 
    } 

    /** 
    * @inherited <p> 
    * Overridden to do nothing 
    */ 
    @Override 
    public void configureColumnWidths(JXTable table, 
      TableColumnExt columnExt) { 
    } 

}; 

final JXTable table = new JXTable(); 
table.setColumnFactory(factory); 
table.setModel(new DefaultTableModel(20, 5)); 
// propertyChangeListener 
PropertyChangeListener l = new PropertyChangeListener() { 

    TableColumn first = table.getColumn(0); 
    TableColumn second = table.getColumn(1); 

    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     TableColumn resizingColumn = (TableColumn) evt.getNewValue(); 
     if (resizingColumn == null) { 
      TableColumn oldResizing = (TableColumn) evt.getOldValue(); 
      TableColumn other = oldResizing == first ? second : first; 
      other.setMaxWidth(Integer.MAX_VALUE); 
      other.setMinWidth(15); 
     } else { 
      TableColumn other = resizingColumn == first ? second : first; 
      other.setMaxWidth(other.getPreferredWidth()); 
      other.setMinWidth(other.getPreferredWidth()); 
     } 

    } 
}; 

table.getTableHeader().addPropertyChangeListener("resizingColumn", l); 

這是SwingX爲lazyness代碼片段 - 很容易實現自己:

A)配置TableColumn來手動

B)子類JTableHeader上並實施setResizingColumn火上變化

c)中的子類的JTable和實施createTableHeader返回子類的報頭

享受! Jeanette

+0

嗨珍妮特,謝謝你的回答,我會盡快嘗試它(「過程」需要它的時間;))。我必須對你的要求做一個小小的修改。答:應該跨越可用空間的三列也必須可以調整大小,但乍一看我認爲它沒有什麼不同。我會改變這個問題,使這一點更清楚。再次感謝 – ftr 2011-03-29 13:35:23

0

AFAIK沒有辦法從自動調整列中排除列。設置最小/最大大小會影響大小計算,但從JTable源看來,您不能排除列。

當使用JTable.AUTO_RESIZE_ALL_COLUMNS時,不能限制要調整大小的列的範圍。因此,調用表模型來設置每列的列寬,並且應用約束。但是,我沒有看到表格模型可以區分自動調整大小和手動調整大小。