2011-11-05 91 views
1

我有一個包含每行刪除按鈕的表。 我用如何從JTable中刪除單行

int row = table.getEditingRow(); //To fetch the current row to delete. 

然後我用

DefaultTableModel model = (DefaultTableModel)table.getModel(); 
model.removeRow(row); 

此刪除JTable中的行,當我第一次刪除的第一行和任何在兩者之間,但如果我刪除了最後一排仍刪除最後一行但隨後刪除的下一個項目將使得當我刪除項目3

一個錯誤說,如果有表

Item1 
Item2 
Item3 

3項

Item1 
Item2 

當我刪除項1或第2項後,它會導致錯誤

java.lang.ArrayIndexOutOfBoundsException: 2 >= 2 

沒有問題,當我刪除項目1,那麼項目2,然後項目3或項目2,然後再項目1,再項目3

這是我如何構造我的CellEditor的

public class JButtonEditor extends AbstractCellEditor implements TableCellEditor, ActionListener{ 
JTable table; 
JButton button = new JButton(); 

public JButtonEditor(JTable table){ 
    this.table = table; 
    button.addActionListener(this); 
} 

@Override 
public Object getCellEditorValue() { 
    return button.getText(); 
} 

@Override 
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
    button.setText(value.toString()); 
    return button; 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    int row = table.getEditingRow(); 
    int column = table.getEditingColumn(); 
    switch(column){ 
     case 3: 
      manage(groupId); break; 
     case 4: 
      editGroup(groupId); break; 
     case 5: 
      deleteGroup(groupId,row); break; 
    } 
} 

private void deleteGroup(int groupId,int row) { 
    //do something here to remove the group from the database 
    DefaultTableModel model = (DefaultTableModel) table.getModel(); 
    model.removeRow(row); 
} 

我認爲我刪除項目3,當我刪除後項目1或項目2下一個它認爲塔t我仍然在刪除Item3,並且它會導致ArrayOutOfBounds錯誤,因爲Item3在表模型中消失了?

我的問題已修復。

public void actionPerformed(ActionEvent e) { 
    int row = table.getEditingRow(); 
    int column = table.getEditingColumn(); 
    fireEditingStopped(); //added this 
    switch(column){ 
     case 3: 
      manage(groupId); break; 
     case 4: 
      editGroup(groupId); break; 
     case 5: 
      deleteGroup(groupId,row); break; 
    } 
} 

這是我改變的唯一的東西,我仍然在使用我的Cell Renderer,它現在可以工作!

+1

也許deleteRow(3)被調用兩次?請在您調用方法的地方發佈代碼。 – Stephan

+1

爲了讓我們確切地看到你做錯了什麼,請顯示你的代碼,最好是[sscce](http://sscce.org)。 –

+0

檢查你的'行'變量。我懷疑你沒有正確使用它 – aishwarya

回答