swing - 在 JTable AbstractDataModel 中一次性删除多行

标签 swing jtable addeventlistener abstracttablemodel

我的 Jtable 和我的数据模型有问题。
我的表模型扩展了 AbstracttableModel,数据存储在一个 Vector 中。
我有一个功能女巫假设删除一行或多行。
这些行不一定是连续的,因为我的 jtable 将 selectionMode 设置为:

jTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

删除行的函数(一一):
public void removeMessageRow(Integer p_idMessage) {
    Enumeration<MlMessage> alldatas = vData.elements();
    while (alldatas.hasMoreElements()) {
        MlMessage m = alldatas.nextElement();
        if (m.getIdMessage() == p_idMessage) {
            int idx = vData.indexOf(m);
            boolean result = vData.remove(m);
            // fireTableDataChanged();
            // fireTableRowsDeleted(idx, idx);
            fireTableStructureChanged();

            return;
        }
    }

当我启动该函数时,我毫无问题地执行循环,在逐步模式下,我可以看到 vData 对象已更新,如果我只执行一次,则 GUI 没有问题。当我选择多于一行时出现问题。
例如,我在表中选择了第 0 行和第 1 行,并启动了函数 removeMessageRow,在第一次执行时,vDataObject 被正确更新(所有数据都被移动,并且这个向量的最后一个元素被设置为空)调用 vData.remove(m)
所以在我的例子中,我希望在第二次执行时,要查找的对象应该在位置 0 但它在位置 1,因为 vData 对象从未更新过。
有人对此有什么想法吗?
我已经尝试了很多着火......但没有人可以立即执行。
感谢您提前提供的任何帮助,并为我的莎士比亚的语言感到抱歉。

最佳答案

在您的模型中添加一个方法,该方法采用要删除的索引集合( Set<Integer>int[] ),对此集合进行排序,在此集合中向后迭代,并删除模型对象列表中的元素:

public void removeRows(int[] indices) {
    Arrays.sort(indices);
    for (int i = indices.length - 1; i >= 0; i--) {
        this.data.remove(indices[i]);
        fireTableRowsDeleted(indices[i], indices[i]);
    }
}

关于swing - 在 JTable AbstractDataModel 中一次性删除多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8294924/

相关文章:

java - Java 中多个具有相同 ResultSet 的 jTable

java - 执行的此操作有什么问题?

java - JScrollPane 中的 IntelliJ JTable

javascript - 检查 Javascript 中文本区域输入时的按键事件监听器

javascript - 删除调用事件监听器的事件监听器

Java SwingUtilities.invokeLater() 拖放计时

java - 在 JTable 中显示 SQL 查询的结果集 (Java)

java - 选择两个 JTable 中的多个项目

javascript - 为什么我不能将事件添加到引用自身的集合中的每个元素而不是 "for(){}"语句中的最后一个元素

java - 你如何改变java中的光标颜色?