【发布时间】:2012-12-04 14:28:41
【问题描述】:
我有一个JTable 使用AbstractTableModel,其中我在第一列中有一个JCheckBox 用于选择行。现在,我需要从选中的表中获取选定的行。现在,我按顺序从第一行遍历到最后一行,并获取所有被选中的行,如下所示,
List<Integer> selectedRows = new ArrayList<Integer>();
for(int i = 0; i < table.getRowCount(); i++) {
if((Boolean) table.getValuAt(i, 0)) {
selectedRows.add(i);
}
}
这里的问题是,当我需要获取选定的行时,我需要遍历所有行。现在我有 10 到 20 行。但将来我会得到大约 5000 行。我的问题是,如果有 5000 行并且用户只选择了第 5000 行(最后一条记录),那么我需要遍历所有 5000 行以获取所选行。我认为这不是一个好方法。
我想要实现的一种方法是,将侦听器添加到JCheckBox 列,这样当(SELECTED/DESELECTED) 发生更改时,我需要更新侦听器类中选定行的数组。在这个监听器类中,当用户选择JCheckBox 时,我需要调用table.getSelectedRow(..),如果选择了JCheckBox,我需要存储。
有没有更好的方法?
【问题讨论】:
-
增强模型:它可以在 setValueAt(...) 中保持/同步包含其“选定”(又名:在第一列中具有布尔值 true)的内部数据结构
-
谢谢。但是,要检索布尔值为真的那个,我需要遍历吗?
-
如果您使用的是 TableModel,则基本上可以使用相同的方法来保留选定行的数组。唯一不同的是你可以从 TableModel 的 setValueAt() 方法中更新它。
-
@Che 在用户选择了一些行之后发生了什么,她/他按下了某个 Jbutton,或者有一些自动 :-),如果有 user_action(JButtons 点击),那么不使用任何增强功能,将 RowFilter 与 String ("true") 一起用于所需列
-
确定 RowFilter 也可以使用 Boolean、Integer、Date ... 值,但我只使用 String value
标签: java swing jtable listener jcheckbox