Удаление строки JTable при применении сортировщика вызывает исключение IndexOutOfBoundsException
У меня есть JTable со строками пользовательских объектов, один столбец которых является компонентом времени, который ведет обратный отсчет. Когда обратный отсчет достигает 0, строка автоматически удаляется.
У меня также есть опция фильтрации через текстовое поле, в которую пользователь может ввести, чтобы отфильтровать строки по их данным.
Без сортировщика, примененного к JTable, все работает правильно (строки удаляются, когда время считается равным 0), кроме фильтрации. Применение сортировщика дает мне «java.lang.IndexOutOfBoundsException: Invalid index»
Моя пользовательская модель стола выглядит следующим образом
public Object getValueAt(int rowIndex, int columnIndex) {
CustomObject myObject = customObjects.get(rowIndex);
if (columnIndex == MyFirstColumn) {
return myObject.getData1();
} else if (columnIndex == MySecondColumn) {
return myObject.getData2();
} else if (columnIndex == TimeRemainingColumn) {
if (myObject.getDate() - System.currentTimeMillis() <= 0) {
//If I comment this out I can filter but not remove rows
removeRow(myObject);
return 0;
}
else{
fireTableDataChanged();
return myObject.getDate() - System.currentTimeMillis();
}
}
return DateFormat.getDateInstance().format(new Date(myObject.getDate()));
}
public void removeRow(CustomObject object) {
int row = customObjects.indexOf(object);
customObjects.remove(object);
fireTableRowsDeleted(row, row);
}
Это выбрасывает это исключение
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid index
at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:514)
at javax.swing.JTable.convertRowIndexToModel(JTable.java:2645)
at javax.swing.JTable.getValueAt(JTable.java:2720)
at javax.swing.JTable.prepareRenderer(JTable.java:5718)
at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:684)
at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581)
at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365)
at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276)
at javax.swing.JComponent.paintComponent(JComponent.java:778)
at javax.swing.JComponent.paint(JComponent.java:1054)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
....
Переходя к DefaultRowSorter.java, он попадает в это исключение
public int convertRowIndexToModel(int index) {
if (viewToModel == null) {
if (index < 0 || index >= getModelWrapper().getRowCount()) {
throw new IndexOutOfBoundsException("Invalid index");
}
return index;
}
return viewToModel[index].modelIndex;
}
Наверх Другой уровень, почему удаление работает без сортировщика (sorter == null)
public int convertRowIndexT,oModel(int viewRowIndex) {
RowSorter sorter = getRowSorter();
if (sorter != null) {
return sorter.convertRowIndexToModel(viewRowIndex);
}
return viewRowIndex;
}
Отладка немного firstRow и endRow оба равны 0 в этот момент (они должны быть?) Но, похоже, пытается сортировать / фильтровать пустой список
Вот мой код таблицы
myModel = new CustomObjectDataModel();
myTable.setModel(myModel);
mySorter = new TableRowSorter(myModel);
myTable.setRowSorter(mySorter);
myTable.setAutoCreateRowSorter(true);
Я искал и нашел неработающие ссылки, указывающие на то, что это ошибка в Java, но не могу подтвердить.