Javax Swing JTable :: getModel vs JTable :: getColumnModel

时间:2015-04-01 14:09:54

标签: java swing

您好我一直在使用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上。 有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

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

  

...但是这样我就无法从tableModel向它添加任何数据,因为该列没有出现在tableModel上

这是正确的。 TableColumnModel的目的是简单地自定义视图,而不是操纵数据。

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

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

table.setAutoCreateColumnsFromModel( false );

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

但总的来说你:

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