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