TableModel与ColumnModel:谁拥有列值?

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

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

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

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

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

总结 : TableColumnModel是列值的最终所有者。 TableColumnModel仅在TableModel没有值时才询问TableModel 。 例如,在将列传递给JTable.addColumn()而不指定标头值的情况下。