【问题标题】:Javax Swing JTable::getModel vs JTable::getColumnModelJavax Swing JTable::getModel 与 JTable::getColumnModel
【发布时间】:2015-04-01 14:09:53
【问题描述】:

您好,我一直在使用 javax swing,但遇到了一个奇怪的问题并让我质疑。 例如,我可以:

JTable table = new JTable();
// Indeed, 2 different objects:
// The TableModel (which, i think is supposed to contain rows and columns?
DefaultTableModel dtm = (DefaultTableModel) table.getModel();
// And the column model, supposed to define the columns of a table?
TableColumnModel tcm = table.getColumnModel();

// I can add columns to my table in two different manners
dtm.addColumn("A Column");
// or
TableColumn column = new TableColumn();
column.setHeaderValue("Another column");
column.setWidth(120);
column.setMinWidth(120);
column.setMaxWidth(120);
tcm.addColumn(column); 
// And notice that both commands will add a column in the table
// So our table model should now have 2 columns.

// But does it?
System.out.println(dtm.getColumnCount()); // outputs 1;
System.out.println(tcm.getColumnCount()); // outputs 2;
System.out.println(table.getColumnCount()); // outputs 2;

// The visual shows 2 columns, but the model has only 1.

从中我可以看出 JTable 使用 tableColumnModel 并且 tableColumnModel 将所有列添加到 tableModel 中,但是,当我向 TableModel 添加列时,它会添加到表中,但 tableModel 仍然过时。

现在,问题是:通过 columnModel 添加列真的很有趣,因为我可以在那里定义大小、布局、可编辑选项,但是这样我不能从 tableModel 向它添加任何数据,因为该列没有'不会出现在 tableModel 上。 对此有什么想法吗?

【问题讨论】:

  • 发布无效代码示例是对任何浪费时间阅读您的问题的人的侮辱。您不声明或初始化变量“列”,这是最重要的。
  • @LorenzoGatti 我做到了,我只是拼错了 Ctrl+V'ng 一个 sn-p 的声明。顺便说一句。
  • 这是SO posting的副本

标签: java swing


【解决方案1】:

TableModel 用于包含数据。数据可按行/列访问。

TableColumnModel被JTable用来控制数据的View。也就是说,它控制在 JTable 中显示的列。您还可以对列重新排序以以不同的顺序显示数据。

...但是通过这种方式,我无法从 tableModel 向其中添加任何数据,因为该列没有出现在 tableModel 上

没错。 TableColumnModel 的目的是简单地自定义视图,而不是操作数据。

也许您的应用程序包含许多数据列,但对特定列的访问受到“安全级别”的限制。在这种情况下,数据始终存储在 TableModel 中,但您需要更改视图以控制哪些数据列可见。因此,您可以从 TableColumnModel 中删除/添加列。

当您向 TableModel 添加列时,JTable 会收到通知并为您重新创建所有 TableColumn。这可能是好事也可能是坏事,因为当重新创建 TableColumnModel 时,您会丢失您可能已添加到 TableColumn 的任何自定义渲染器和编辑器。您可以使用以下方式防止这种情况发生:

table.setAutoCreateColumnsFromModel( false );

现在 TableColumnModel 将不会更新,您有责任手动创建 TableColumn 并将其添加到 TableColumnModel。

但总的来说你:

  1. 通过 TableModel 添加/更改数据。
  2. 通过 TableColumnModel 更改视图。

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2014-05-31
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多