正如托马斯已经回答的那样,没有简单的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