从JTable删除正在编辑的行

| 我有一个JTable及其旁边的一个按钮,它称为
deleteSelectedRows()
,它的确听起来像这样:
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行并且表中只剩下一行。 然后,我用3英镑尝试了各种娱乐和游戏。首先,在删除之前添加ѭ4似乎可行,但随后删除已编辑单元格上方的行会导致问题。 然后我尝试了这个:
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();
    }
}
但这永远不会删除任何内容。从我周围散布的ѭ6来看,要突出显示的最后一个单元格(在
spam
上看到的特殊边框)被认为是编辑行的一部分,因此触发了我早先的
return
。 因此,我并不在乎解决方案是否涉及解决原始问题(删除正在编辑的单元格时古怪的结果)或这个新问题(
getEditingRow()
行为不符合我的预期),'只是我至少需要其中一种来做。就是说,出于学术好奇心,我很想听到这两种解决方案。提前致谢。     
已邀请:
        在从模型中删除任何行之前,尝试包括以下行:
if (table.isEditing()) {
    table.getCellEditor().stopCellEditing();
}
    
        表格停止编辑有一个通用的解决方案,当您需要支持任意数量的按钮时,该解决方案非常方便。     
        如霍华德所说,有必要在修改模型之前停止单元格编辑。但是,也有必要检查单元是否被实际修改,以避免空指针异常。 这是因为如果当前不编辑表,则getCellEditor()方法将返回null:
if (myTable.isEditing()) // Only if it\'s is being edited
         myTable.getCellEditor().stopCellEditing();
    ...
在某些情况下,单元格编辑器可能会拒绝停止编辑, 这可能发生,例如,如果您使用的是一些复杂的编辑器,正在等待对话框中的用户输入。在这种情况下,您应该添加额外的检查:
if (myTable.isEditing()) 
   if (!myTable.getCellEditor().stopCellEditing()) {

     // If your update is user-generated:
     JOptionPane.showMessageDialog(null, \"Please complete cell edition first.\");

     // Either way return without doing the update.
     return;
   }
在您的代码中,您尝试仅删除未编辑的行,但是当单元格编辑器停止编辑时,这也会引发ArrayOutOfBounds异常。最好是在刷新之前将其停止。 最后,似乎还可以在表中设置一个属性:
 table.putClientProperty(\"terminateEditOnFocusLost\", Boolean.TRUE);
如此处所述。     

要回复问题请先登录注册