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的情况下。

09-05 16:29
查看更多