Usunięcie wiersza JTable po zastosowaniu sortownika powoduje wyjątek IndexOutOfBoundsException

Mam tabelę JTable z wierszami obiektów niestandardowych, której jedna kolumna jest składnikiem czasu, który odlicza czas. Gdy odliczanie osiągnie 0, wiersz ma się automatycznie usunąć.

Mam też opcję filtrowania za pomocą pola tekstowego, którą użytkownik może wpisać, aby filtrować wiersze według ich danych.

Bez sortera zastosowanego do JTable wszystko działa poprawnie (wiersze usuwają się, gdy czas liczy się do 0) oprócz filtrowania. Zastosowanie sortownika daje mi „java.lang.IndexOutOfBoundsException: Nieprawidłowy indeks”

Mój niestandardowy model tabeli wygląda tak

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);
}

To powoduje ten wyjątek

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)
....

Przechodząc do DefaultRowSorter.java, trafia na ten wyjątek

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;
}

Up Inny poziom, dlaczego usuwanie działa bez sortownika (sorter == null)

public int convertRowIndexToModel(int viewRowIndex) {
    RowSorter sorter = getRowSorter();
    if (sorter != null) {
        return sorter.convertRowIndexToModel(viewRowIndex);
    }
    return viewRowIndex;
}

Debugowanie bitów firstRow i endRow wynosi 0 w tym momencie (powinny być?), Ale wydaje się, że próbuje sortować / filtrować pustą listę

Oto mój kod tabeli

    myModel = new CustomObjectDataModel();

    myTable.setModel(myModel);
    mySorter = new TableRowSorter(myModel);

    myTable.setRowSorter(mySorter);
    myTable.setAutoCreateRowSorter(true);

Szukałem i znalazłem martwe linki do sugestii, że jest to błąd w Javie, ale nie mogę go potwierdzić.

questionAnswers(1)

yourAnswerToTheQuestion