2011-11-05 83 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

回答