在JTable AbstractDataModel中的单个传递中删除多行

Sim*_*iné 4 swing jtable addeventlistener abstracttablemodel

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

jTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
Run Code Online (Sandbox Code Playgroud)

删除行的功能(逐个):

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我启动该功能时,我执行循环没有问题,在逐步模式下,我可以看到更新的vData对象,如果我执行这一次只有一次没有GUI的问题.当我选择多行时会出现问题.例如,我在我的表中选择了行号0和数字1,并且我执行了removeMessageRow函数,在第一次执行时,vDataObject被正确更新(所有数据都被删除,并且此向量的最后元素被设置为null打电话vData.remove(m).所以在我的情况,我希望在第二个执行,找对象应该是在位置0,但它在为VDATA对象从未更新过位置1.没有任何人有关于这种想法?我已经尝试了许多火上浇油的东西,但没有人立即执行.感谢任何帮助提前和抱歉我的莎士比亚的语言.

JB *_*zet 15

在模型中添加一个方法,使用一组索引删除(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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 因为如果要删除索引 1 和 4 处的元素,一旦删除了索引 1 处的元素,原来位于索引 4 处的元素现在位于索引 3 处。 (2认同)