JTable.getModel().getColumnName()
和JTable.getColumnModel().getColumn(index).getHeaderValue()
之间有什么区别?这两个似乎没有共享任何数据。我的猜测是TableModel.getColumnName()
表示列的文本表示,而TableColumn.getHeaderValue()
和TableColumn.getHeaderRenderer()
确定列的外观(它不需要是纯文本)。
什么保证两者保持同步?如果两者发生冲突会怎样?
答案 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()而未指定标头值。