2012-03-28 51 views
0

在名爲HistoryPanel的類中,我有一個名爲resultsTable的靜態JTable,其中包含一個名爲tableModel的靜態DefaultTableModel。該表具有自定義單元格編輯:JTable通過單擊具有自定義DeleteCellEditor的單元格從相同的JTable中刪除行

resultsTable.getColumn("Delete").setCellEditor(new DeleteButtonEditor(new JCheckBox())); 

裏面,自然,我重寫這樣這兩種方法:

public Object getCellEditorValue() 
{ 
    if (isPushed) 
    { 
     HistoryPanel.tableModel.removeRow(HistoryPanel.resultsTable.getSelectedRow()); 
    } 
} 

protected void fireEditingStopped() 
{ 
    super.fireEditingStopped(); 
} 

唯一的例外是暫時只有拋出當我嘗試刪除的最後一行resultsTable。當我刪除不是最後一行的行時,它完美地工作。唯一的例外是:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1 

和導致異常的代碼行是:

super.fireEditingStopped(); 

誰能幫助我?如何避免此異常

回答

1

當前您在編輯操作期間刪除正在編輯的行。如果你發佈了一個SSCCE,這將會容易得多,所以我可以測試我提出的解決方案,但現在我將把它留給你。

我假設你的包裹

if (isPushed) 
{ 
    HistoryPanel.tableModel.removeRow(HistoryPanel.resultsTable.getSelectedRow()); 
} 

內的EventQueue.invokeLater通話可能會解決這個問題。這種方式編輯完成時,您刪除該行。

+0

謝謝!奇蹟般有效! – 2012-03-28 23:10:47

+0

@HristoValchevHristov再考慮[接受答案】(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work),以便其他人可以看到這個問題已經解決 – Robin 2012-03-29 05:57:40

1

真的,爲什麼不直接使用Boolean價值,爲什麼會出現Editor for JCheckBox,你必須檢查教程how the JTable works

編輯

你必須調用

int row = table.convertRowIndexToModel(table.getEditingRow()); 
fireEditingStopped(); 

和thenafter你可以真正TableCellEditor要求刪除