Swing/ResetRowFilter の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/ResetRowFilter へ行く。
- Swing/ResetRowFilter の差分を削除
--- category: swing folder: ResetRowFilter title: JTableのRowFilterを一旦解除してソート tags: [JTable, RowFilter, TableRowSorter] author: aterai pubdate: 2008-11-03T16:35:24+09:00 description: JTableのRowFilterを一旦解除してソートし、再びフィルタを設定することで表示される行を更新します。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTRuQZLwOI/AAAAAAAAAho/ovjovr-5nuI/s800/ResetRowFilter.png hreflang: href: https://java-swing-tips.blogspot.com/2009/03/reset-rowfilter-before-sorting.html lang: en --- * 概要 [#summary] `JTable`の`RowFilter`を一旦解除してソートし、再びフィルタを設定することで表示される行を更新します。 #download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTRuQZLwOI/AAAAAAAAAho/ovjovr-5nuI/s800/ResetRowFilter.png) * サンプルコード [#sourcecode] #code(link){{ RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() { @Override public boolean include(Entry<? extends TableModel, ? extends Integer> entry) { int vidx = table.convertRowIndexToView(entry.getIdentifier()); return vidx < USER_SPECIFIED_NUMBER_OF_ROWS; } }; TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model) { @Override public void toggleSortOrder(int column) { if (check.isSelected()) { RowFilter<? super TableModel, ? super Integer> f = getRowFilter(); setRowFilter(null); super.toggleSortOrder(column); setRowFilter(f); } else { super.toggleSortOrder(column); } } }; table.setRowSorter(sorter); sorter.setSortKeys(Arrays.asList(new RowSorter.SortKey(1, SortOrder.DESCENDING))); }} * 解説 [#explanation] 上記のサンプルでは、☑ `viewRowIndex<5`をチェックするとソート状態とは無関係に表示上の`0`から`4`行目までの`5`行のみ表示されるフィルタが掛かります。 - `Custom Sorting`チェック無し -- ☑ `viewRowIndex<5`のフィルタで`AA-ee`が表示されている場合、`String`列で昇順から降順にソートすると`ee-AA`となる - `Custom Sorting` チェック有り -- ☑ `viewRowIndex<5`のフィルタで`AA-ee`が表示されている場合、`String`列で昇順から降順にソートすると`OO-KK`となる --- `toggleSortOrder`メソッドをオーバーライドして一旦`TableRowSorter#setRowFilter(null)`を実行し、`RowFilter`を解除してから昇順から降順にソート`OO-KK-AA`、その後再び`RowFilter`を設定すると`OO-KK`が表示される ---- - 以下のように`toggleSortOrder`メソッドをオーバーライドし、すべての行が変更されている可能性があることをリスナーに通知してから再度ソートを実行する方法もある #code{{ TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model) { @Override public void toggleSortOrder(int column) { super.toggleSortOrder(column); if (check.isSelected()) { model.fireTableDataChanged(); // ??? allRowsChanged(); // modelRowCount = getModelWrapper().getRowCount(); sort(); } } }; }} * 参考リンク [#reference] - [https://bugs.openjdk.java.net/browse/JDK-6301297 Specification for the javax.swing.DefaultRowSorter.setSortsOnUpdates/rowsUpdated method is not clear] - [https://bugs.openjdk.org/browse/JDK-6301297 Specification for the javax.swing.DefaultRowSorter.setSortsOnUpdates/rowsUpdated method is not clear] * コメント [#comment] #comment - もっと簡単な方法がありそう・・・。 -- &user(aterai); &new{2008-11-03 (月) 16:35:24}; #comment