2011-11-28 58 views
3

我遇到了Jtable和我的dataModel的问题。 我的表模型扩展了AbstracttableModel,数据存储在Vector中。 我有一个功能女巫是想要删除一个或多个行。 这些行不一定是连续的,因为我的JTable设置的SelectionMode为这样:在JTable中一次删除多行AbstractDataModel

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被正确更新(所有数据都被shiffted,并且此向量的最后一个元素被设置为null调用vData.remove(m) 所以在我的情况下,我期望在第二次执行时,要找到的对象应该在位置0,但它位于位置1,因为vData对象从未更新过。 ? 我已经提前尝试了许多火...的东西,但没有人semms到立刻执行。 感谢您的帮助和我莎士比亚的语言遗憾。

回答

13

在模型中添加一个方法以指数集删除(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]); 
    } 
} 
+0

这是完美的工作,谢谢! –

+0

嗨,我刚刚遇到同样的问题。这个解决方案确实有效你能解释为什么你需要以相反的顺序迭代集合吗?谢谢。 :) – Mihai

+1

因为如果要删除索引1和4中的元素,只要删除索引1处的元素,索引4处的元素现在位于索引3处。 –

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 
+0

欢迎使用StackOverFlow,请提供解释以支持您的代码片段,以便其他用户可以从错误中学习并帮助社区。 –