2011-06-14 98 views
4

正在編輯我有一個JTable和旁邊調用deleteSelectedRows(),這也正是它聽起來像一個按鈕:刪除行從JTable中

public void deleteSelectedRows() { 
    int[] selected = jTable.getSelectedRows(); 
    for(int i = selected.length - 1; i >= 0; i--) { 
     model.removeRow(selected[i]); 
    } 
    if(model.getRowCount() < 1) { 
     addEmptyRow(); 
    } 
} 

但是,如果電池在行爲被當編輯它(和/或細胞在其上方)已被刪除,編輯的細胞停留而其餘的離開,就像這樣:

然後試圖退出編輯出來扔了一個ArrayIndexOutOfBoundsException因爲第5行是想被訪問和th只剩下一行了。

然後我用jTable.getEditingRow()嘗試了各種各樣的樂趣和遊戲。起初,在刪除之前添加if(selected[i] != editing)似乎可行,但刪除編輯單元格上方的行會導致問題。

然後我嘗試這樣的:

public void deleteSelectedRows() { 
    int[] selected = jTable.getSelectedRows(); 
    int editing = jTable.getEditingRow(); 
    for(int s : selected) { //PS: Is there a better way of doing a linear search? 
     if(s == editing) { 
      return; 
     } 
    } 
    for(int i = selected.length - 1; i >= 0; i--) { 
     model.removeRow(selected[i]); 
    } 
    if(model.getRowCount() < 1) { 
     addEmptyRow(); 
    } 
} 

但是,這並不刪除任何東西,永遠。從println來看,最後一個要突出顯示的單元格(在這裏看到的特殊邊框spam)被認爲是編輯行的一部分,因此觸發了我的早期return

所以,我真的不關心解決方案是否涉及固定最初的問題 - 那古怪的結果時,正在編輯一個單元已被刪除 - 或者這個新的問題 - 即getEditingRow()不按照我的預期行事,只是我至少需要其中的一個纔會發生。也就是說,我有興趣聽到兩種解決方案出於學術好奇。提前致謝。

回答

6

嘗試從模型中取出任何行之前,包括下面幾行:

if (table.isEditing()) { 
    table.getCellEditor().stopCellEditing(); 
} 
+0

謝謝,這樣做! – tsm 2011-06-14 20:19:57

+0

正確但不完整:不包括編輯拒絕停止的情況,需要像f.i一樣的後備。在這種情況下取​​消 – kleopatra 2011-06-15 08:27:55

0

正如霍華德所說,在修改模型之前有必要停止單元格編輯。但也有必要檢查單元格是否真正被修改以避免空指針異常。 這是因爲getCellEditor()方法將返回如果表沒有被目前編輯:

if (myTable.isEditing()) // Only if it's is being edited 
     myTable.getCellEditor().stopCellEditing(); 
    ... 

存在該單元格編輯器可以拒絕停止編輯的情況下, 那可能會發生,即如果您正在使用一些複雜的編輯器,正在等待用戶輸入對話框。在這種情況下,你應該添加一個額外的檢查:

​​

在你的代碼,你想只刪除沒有被編輯的行,但是當單元格編輯器停止編輯,這也將引發ArrayOutOfBounds異常。最好的是在刷新之前停止它。

最後,似乎你也可以在你的表格設置屬性:

table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 

的解釋here