Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javax Swing JTable::getModel与JTable::getColumnModel_Java_Swing - Fatal编程技术网

Javax Swing JTable::getModel与JTable::getColumnModel

Javax Swing JTable::getModel与JTable::getColumnModel,java,swing,Java,Swing,您好,我一直在使用javaxswing,我遇到了一个奇怪的问题,并受到了质疑。 例如,我可以: 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(); // A

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

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上。 对此有何想法?

表格模型用于包含数据。可以在行/列中访问数据

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

…但通过这种方式,我无法从tableModel向其中添加任何数据,因为该列不显示在tableModel上

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

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

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

table.setAutoCreateColumnsFromModel( false );
现在,TableColumnModel将不会更新,您有责任手动创建TableColumn并将其添加到TableColumnModel中

但总的来说,你:

通过TableModel添加/更改数据。 通过TableColumnModel更改视图。 TableModel用于包含数据。可以在行/列中访问数据

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

…但通过这种方式,我无法从tableModel向其中添加任何数据,因为该列不显示在tableModel上

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

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

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

table.setAutoCreateColumnsFromModel( false );
现在,TableColumnModel将不会更新,您有责任手动创建TableColumn并将其添加到TableColumnModel中

但总的来说,你:

通过TableModel添加/更改数据。 通过TableColumnModel更改视图。
发布无效代码示例是对任何浪费时间阅读您的问题的人的侮辱。您没有声明或初始化变量列,这是最重要的一列。@LorenzoGatti我声明了,我只是在Ctrl+V'ng中拼错了声明。固定顺便说一句。这是一个重复的张贴无效的代码样本是对任何人的侮辱谁浪费时间阅读你的问题。您没有声明或初始化变量列,这是最重要的一列。@LorenzoGatti我声明了,我只是在Ctrl+V'ng中拼错了声明。固定顺便说一句。这是一个重复的这个