У меня есть таблица, которая содержит кнопки удаления для каждой строки.Я использую
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
Нет проблем, когда я сначала удаляю Item1, затем Item2, затем Item3 или Item2, затем Item1, затем Item3
Вот как япостроил мой 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);
}
Я думаю, что после того, как я удалил Item3, когда я удаляю Item1 или Item2 рядом, он думает, что я все еще удаляю 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, и теперь он работает!