TableModel vs ColumnModel:谁拥有列值?

2022-09-02 20:51:44

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

什么能保证两者保持同步?如果两者发生冲突,会发生什么情况?


答案 1

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

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

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

总之TableColumnModel 是列值的最终所有者。TableColumnModel 仅在没有值时才要求 TableModel 提供值。例如,在将列传递到 JTable.addColumn() 而不指定标头值的情况下。


答案 2

推荐