In your table model:
public void delte_raw(int raw) {
if (!ls.isEmpty()) {
this.fireTableRowsDeleted(raw+1, raw); // why raw+1 ???
ls.remove(raw);
}
}
As your table model extends from AbstractTableModel
and looking at fireTableRowsDeleted(int firstRow, int lastRow) javadoc:
Notifies all listeners that rows in the range
[firstRow, lastRow]
, inclusive, have been deleted.
So it should be:
public void delte_raw(int raw) {
if (!ls.isEmpty()) {
ls.remove(raw); // remove the row index from the List and then fire the event
fireTableRowsDeleted(raw, raw);
}
}
Knowing the exception source: looking at DefaultRowSorter.checkAgainstModel(int firstRow, int endRow)
implementation:
private void checkAgainstModel(int firstRow, int endRow) {
if (firstRow > endRow || firstRow < 0 || endRow < 0 ||
firstRow > modelRowCount) {
throw new IndexOutOfBoundsException("Invalid range");
}
}
As you can see, calling this method with [raw+1,raw]
range causes an IndexOutOfBoundsException
.
Edit
As @mKorbel masterfully points out, I've totally overlooked this:
int raw = table.getSelectedRow(); // this is the index in the view
model.delte_raw(raw); // convert raw in the right model index is needed
You need to convert raw
in the right model index. Otherwise it can cause side effects since in a sorted table is most likely the selected index in the view be different than its related model's index:
int raw = table.getSelectedRow(); // this is the index in the view
model.delte_raw(table.convertRowIndexToModel(raw)); // perfect