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

时间:2011-11-28 11:08:34

标签: swing jtable addeventlistener abstracttablemodel

我遇到了Jtable和我的dataModel问题。 我的表模型扩展了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被正确更新(所有数据都被删除,并且此向量的最后元素被设置为null致电vData.remove(m)。 所以在我的情况下,我希望在第二次执行时,要查找的对象应该位于位置0,但它位于位置1,因为vData对象从未更新过。 有人对此有所了解吗? 我已经尝试了许多火上浇油的东西,但没有人能立即执行。 感谢您提前提供的任何帮助,抱歉我的莎士比亚语言。

2 个答案:

答案 0 :(得分:14)

在模型中添加一个方法,将一组索引删除(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]);
    }
}

答案 1 :(得分:0)

int[] selectedRow = tblUsuarios.getSelectedRows();
int del=1;
for(int j=0; j<selectedRow.length; j++){
    modTabla.removeRow(selectedRow[j]);
    if(j<selectedRow.length-1){
        selectedRow[j+1] = selectedRow[j+1]-del;
        del = del+1;
    }
}

//modTabla = defaultTableModel
//tblUsuarios = jtable