0

RowSorterJtable にを設定しようとしています。メソッドを使用しsetAutoCreateRowSorter(Boolean b)て行を並べ替えました

table.setAutoCreateRowSorter(true);

しかし、テーブルを として作成するとrawSorted、奇妙なエラーが発生します。

行を削除したいときに競合が表示されfireTableRowsDeleted()ます。

int raw = table.getSelectedRow();  // the index of raw that i want to delete it
System.out.println(raw);
model.delte_raw(raw); // model is my table model

public void delte_raw(int raw)
         {
             if (!ls.isEmpty()) {
         this.fireTableRowsDeleted(raw+1, raw);
         ls.remove(raw);
         }

2 つのケースで、上記のコードを返す結果を示したいと思います。

ケース 1:

テーブルを rawsorted として作成しない場合:

table.setAutoCreateRowSorter(false);

行を削除すると、すべて正常に機能します。

ケース 2:

テーブルを rawsorted として作成すると、次のようになります。

table.setAutoCreateRowSorter(true);

行を削除すると、次のようなエラーが発生します。

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid range
    at javax.swing.DefaultRowSorter.checkAgainstModel(DefaultRowSorter.java:921)
    at javax.swing.DefaultRowSorter.rowsDeleted(DefaultRowSorter.java:878)
    at javax.swing.JTable.notifySorter(JTable.java:4277)
    at javax.swing.JTable.sortedTableChanged(JTable.java:4121)
    at javax.swing.JTable.tableChanged(JTable.java:4398)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:296)
    at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(AbstractTableModel.java:261)

エラーは私のdefaultRowSorterにあると思うので、cellRenderer以下のように定義しました:

//    final TableCellRenderer r = table.getTableHeader().getDefaultRenderer();
//TableCellRenderer wrapper = new TableCellRenderer() {
//            private Icon ascendingIcon = new ImageIcon("images/e.png");
//            private Icon descendingIcon = new ImageIcon("images/e.png");
//
//    @Override
//    public Component getTableCellRendererComponent(JTable table,
//            Object value, boolean isSelected, boolean hasFocus,
//            int row, int column) 
//    {
//        Component comp = r.getTableCellRendererComponent(table, value, isSelected, 
//            hasFocus, row, column);
//        if (comp instanceof JLabel) {
//            JLabel label = (JLabel) comp;
//            label.setIcon(getSortIcon(table, column));
//        }
//        return comp;
//    }
//
//    /**
//     * Implements the logic to choose the appropriate icon.
//     */
//    private Icon getSortIcon(JTable table, int column) {
//        SortOrder sortOrder = getColumnSortOrder(table, column);
//        if (SortOrder.UNSORTED == sortOrder) {
//            return null;
//        }
//        return SortOrder.ASCENDING == sortOrder ? ascendingIcon : descendingIcon;
//    }
//
//    private SortOrder getColumnSortOrder(JTable table, int column) {
//        if (table == null || table.getRowSorter() == null) {
//            return SortOrder.UNSORTED;
//        }
//        List<? extends RowSorter.SortKey> keys = table.getRowSorter().getSortKeys();
//        if (keys.size() > 0) {
//                    RowSorter.SortKey key = keys.get(0);
//            if (key.getColumn() == table.convertColumnIndexToModel(column)) {
//                return key.getSortOrder();
//            }
//        }
//        return SortOrder.UNSORTED;
//    }
//
//};
//table.getTableHeader().setDefaultRenderer(wrapper);

しかし、またしても同じエラー!

なぜこのエラーが発生するのですか? 私はそれをたくさんグーグルで検索しましたが、間違ったキーワードを使用したか、インターネット上に簡単な解決策がありません.

4

1 に答える 1