TableModel与ColumnModel:谁拥有列值?

时间:2010-09-12 18:54:37

标签: java swing jtable

JTable.getModel().getColumnName()JTable.getColumnModel().getColumn(index).getHeaderValue()之间有什么区别?这两个似乎没有共享任何数据。我的猜测是TableModel.getColumnName()表示列的文本表示,而TableColumn.getHeaderValue()TableColumn.getHeaderRenderer()确定列的外观(它不需要是纯文本)。

什么保证两者保持同步?如果两者发生冲突会怎样?

1 个答案:

答案 0 :(得分:30)

如果使用JTable构建TableModel,但没有TableColumnModel,则JTable会使用TableColumnModel创建createDefaultColumnModel()并设置{ {3}}为真。当此属性为true时,autoCreateColumnsFromModel将使用JTable中的值填充TableColumnModel

似乎没有人保证两者保持同步。例如,TableModel将返回JTable.getColumnName()列名称,而不管TableModel实际显示在屏幕上的内容。

我注意到的另一个有趣的事情是TableColumnModel仅限于String列,而TableModel允许您将任何Object传递给TableColumnModel。 Javadoc TableCellRenderer表示值仅限于字符串,但事实上这是特定于实现的。没有什么能阻止您编写使用says值的实现。

总结JComponent是列值的最终所有者。 TableColumnModel只有在TableColumnModel尚未拥有值时才会询问TableModel。例如,如果您将列传递到JTable.addColumn()而未指定标头值。