在表模型更改中保留 JTable 选择

2022-09-03 07:44:09

我们看到,当我们从 中执行或JTablefireTableDataChanged()fireTableRowsUpdated()TableModel

这是意料之中的,还是我们做错了什么?我在(或其他相关类)上没有看到任何关于在模型更新时清除/保留选择的属性。JTable

如果这是默认行为,是否有好的方法可以防止这种情况?也许有某种方法可以在更新之前“锁定”选择并在更新后解锁?

开发人员一直在尝试在更新之前保存所选内容并重新应用它。有点慢。

这是Windows XP上的Java 1.4.2,如果这很重要的话。根据我们使用的某些供应商代码,我们仅限于该版本。


答案 1

您需要保留所选内容,然后重新应用它。

首先,您需要获取所有选定单元格的列表。

然后,当您使用新数据重新加载JTable时,您需要以编程方式重新应用这些相同的选择。

我想说的另一点是,如果每次重新加载表模型后,表中的数目、行数或列都在增加或减少,那么请不要费心保留选择。

用户可以选择第 2 行第 1 列,其值为“Duck”,然后模型更新。但在模型更新后,相同的数据现在可以出现在第 4 行第 1 列中,并且原始单元格行 2 列 1 可能具有新数据,例如“Pig”。现在,如果您强行将所选内容设置为模型更新之前的状态,则这可能不是用户想要的。

因此,以编程方式选择细胞可能是一把双刃剑。如果您不确定,请不要这样做。


答案 2

如果表的结构未更改(即,如果您尚未添加/删除任何列/行),则可以自动保留该表的选择,如下所示。

如果你已经编写了自己的 TableModel 实现,你只需重写 fireTableDataChanged() 方法:

@Override
public void fireTableDataChanged() {
    fireTableChanged(new TableModelEvent(this, //tableModel
        0, //firstRow
        getRowCount() - 1, //lastRow 
        TableModelEvent.ALL_COLUMNS, //column 
        TableModelEvent.UPDATE)); //changeType
}

这应该确保您的选择得到维护,前提是只有数据而不是表的结构发生了变化。这与此方法不被覆盖时调用的唯一区别是 getRowCount() - 1 是为 lastRow 参数传递的,而不是 Integer.MAX_VALUE,后者充当了一个能指,不仅更改了表中的所有数据,而且还可能具有行数。


推荐