2011-11-28 52 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,請提供解釋以支持您的代碼片段,以便其他用戶可以從錯誤中學習並幫助社區。 –