2011-03-29 51 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时,不能限制要调整大小的列的范围。因此,调用表模型来设置每列的列宽,并且应用约束。但是,我没有看到表格模型可以区分自动调整大小和手动调整大小。