JTable.getModel().getColumnName()
和JTable.getColumnModel().getColumn(index).getHeaderValue()
有什么区别?两者似乎没有共享任何数据。我的猜测是TableModel.getColumnName()
指示列的文本表示形式,而TableColumn.getHeaderValue()
和TableColumn.getHeaderRenderer()
确定列的外观(不必为纯文本)。
是什么确保两者保持同步?如果两个冲突怎么办?
最佳答案
如果JTable是用TableModel构造的,但没有TableColumnModel,则JTable将使用TableColumnModel创建createDefaultColumnModel()并将autoCreateColumnsFromModel设置为true。当此属性为true时,JTable将使用TableColumnModel中的值填充TableModel。
似乎没有人保证两者保持同步。例如,JTable.getColumnName()将返回TableModel列名,而不管TableColumnModel实际在屏幕上显示什么。
我注意到的另一件有趣的事情是TableModel仅限于String列,而TableColumnModel允许您将任何Object传递给TableCellRenderer。 Javadoc says将该值限制为字符串,但实际上这是特定于实现的。没有什么可以阻止您编写使用JComponent值的实现。
总结:TableColumnModel是列值的最终所有者。 TableColumnModel仅在TableModel还没有值的情况下才询问JTable.addColumn()。例如,在不指定标题值而将列传递到ojit_a的情况下。