1

カスタムオブジェクトの行を含むJTableがあり、その1つの列はカウントダウンする時間コンポーネントです。カウントダウンが0に達すると、行は自動的に削除されます。

また、ユーザーがデータで行をフィルタリングするために入力できるテキストボックスを介したフィルターオプションもあります。

JTableにソーターを適用しないと、フィルタリング以外のすべてが正しく機能します(時間が0になると行が削除されます)。ソーターを適用すると、「java.lang.IndexOutOfBoundsException:無効なインデックス」が表示されます

私のカスタムテーブルモデルは次のようになります

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 convertRowIndexToModel(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のバグであることを示唆するデッドリンクを見つけましたが、確認できません。

4

1 に答える 1

0

提案されたように代わりにSwingTimersを使用してこれを実装し、問題を修正しましたが、ここでの問題は、EDTの外部でテーブルモデルを変更することでした。

于 2013-02-23T00:54:39.900 に答える