如何在JTable Invisible for Swing Java中创建一个列

om.*_*om. 39 java swing invisible jtable

我设计了一个GUI,其中我使用了一个JTable,我必须使2个列不可见.我该怎么办?

cam*_*ckr 62

TableColumn从中取出TableColumnModel.

TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn( tcm.getColumn(...) );
Run Code Online (Sandbox Code Playgroud)

如果您需要访问数据,那么您可以使用table.getModel().getValueAt(...).

对于允许用户根据需要隐藏/显示列的更复杂的解决方案,请查看表列管理器.

  • 即使使用上述方法,数据仍然在模型中,这就是您可以访问它的原因,如上所示.这就是MVC的工作原理.我们所做的只是改变观点.当您将宽度设置为0时,尝试使用Tab键,当您点击隐藏列时,焦点会消失,直到您再次选中.这会让用户感到困惑. (4认同)
  • @Dima你需要了解`view`和`model`之间的区别.表方法总是引用视图.JTable API有一堆你可以使用的`convertXXX`方法.所以你可以使用`convertColumnIndexToModel(...)` (3认同)
  • 这是真正正确的方法 - 将宽度设置为0是一种虚假.这样您仍然可以在模型中获得数据; 你只是隐藏了部分视图. (2认同)

zaw*_*tut 35

首先从视图中删除列

 table.removeColumn(table.getColumnModel().getColumn(4));
Run Code Online (Sandbox Code Playgroud)

然后从模型中检索数据.

table.getModel().getValueAt(table.getSelectedRow(),4);
Run Code Online (Sandbox Code Playgroud)

需要注意的一点是,在检索数据时,必须从模型中检索而不是从表中检索数据.


Mr.*_*mon 17

我尝试了两种可行的解决方案,但都解决了第一种解决方案.

   table.removeColumn(table.getColumnModel().getColumn(4));
Run Code Online (Sandbox Code Playgroud)

要么

   table.getColumnModel().getColumn(4).setMinWidth(0);
   table.getColumnModel().getColumn(4).setMaxWidth(0);
   table.getColumnModel().getColumn(4).setWidth(0);
Run Code Online (Sandbox Code Playgroud)

在我最近的案例中,我更喜欢第二种解决方案,因为我添加了一个TableRowSorter.

   TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
   table.setRowSorter(sorter);
Run Code Online (Sandbox Code Playgroud)

使用时table.removeColumn(table.getColumnModel().getColumn(4)),它将从视图/表中物理删除列,因此您无法使用table.getValueAt(row, 4)- 它返回ArrayIndexOutOfBounds.获取已删除列的值的唯一方法是调用table.getModel().getValueAt(table.getSelectedRow(),4).由于TableRowSorter只对表中的内容进行排序,而不对DefaultTableModel对象中的数据进行排序,因此问题是在对记录进行排序获取值时- 它将从DefaultModelObject中检索未排序的数据.

所以我使用了第二种解决方案然后使用 table.getValueAt(table.getSelectedRow(),4);

我看到第二种方法的唯一问题是@camickr提到:"当你将宽度设置为0时,尝试使用Tab键,当你点击隐藏列时,焦点会消失,直到你再次选中.这会让用户感到困惑."

  • 使用`table.getModel().getValueAt(table.convertRowIndexToModel(row),4). (7认同)

Ant*_*Dev 6

我有同样的问题,因为我使用TableColumnModel removColumn();的确没有帮助我所以我用这个

table.getColumnModel().getColumn(0).setWidth(0);
table.getColumnModel().getColumn(0).setMinWidth(0);
table.getColumnModel().getColumn(0).setMaxWidth(0); 
Run Code Online (Sandbox Code Playgroud)

并且对我来说很好,它隐藏了第0列,我仍然可以从中获得价值


Aar*_*lla 5

将最小、最大和“正常”宽度设置为 0:

jTable.getColumn("ABC").setMinWidth(0); // Must be set before maxWidth!!
jTable.getColumn("ABC").setMaxWidth(0);
jTable.getColumn("ABC").setWidth(0);
Run Code Online (Sandbox Code Playgroud)

注意:由于您不能设置maxWidth< minWidth,您需要先更改minWidth,(javadoc)。也是如此width

第二种方法是扩展TableColumnModel和覆盖所有方法以创建模型没有这两列的错觉(对于 JTable)。

所以当你隐藏一列时,你必须在表询问列数时少返回一个,当它询问列X时,你可能要在列索引上加+1(取决于是否在左边)或隐藏列的右侧)等。

让您的新表模型将所有方法调用(带有更正的索引等)转发到实际列模型,并在 JTable 中使用新表模型。