TableModel与ColumnModel:谁拥有列值?

Gil*_*ili 17 java swing jtable

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

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

Gil*_*ili 30

如果使用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()而不指定标头值的情况下.