• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableのRowFilterを一旦解除してソート
#navi(../)
RIGHT:Posted by [[aterai]] at 2008-11-03
*JTableのRowFilterを一旦解除してソート [#w1c7ac54]
JTableのRowFilterを一旦解除してソートし、再びフィルタを設定することで表示される行を更新します。
---
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`を一旦解除してソートし、再びフィルタを設定することで表示される行を更新します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTRuQZLwOI/AAAAAAAAAho/ovjovr-5nuI/s800/ResetRowFilter.png)

//#screenshot
#ref(http://lh5.ggpht.com/_9Z4BYR88imo/TQTRuQZLwOI/AAAAAAAAAho/ovjovr-5nuI/s800/ResetRowFilter.png)

**サンプルコード [#w70af4db]
#code{{
final RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() {
  @Override
  public boolean include(Entry<? extends TableModel, ? extends Integer> entry) {
* サンプルコード [#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;
    return vidx < USER_SPECIFIED_NUMBER_OF_ROWS;
  }
};
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model) {
  @Override
  public void toggleSortOrder(int column) {
    if(check.isSelected()) {
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{
    } else {
      super.toggleSortOrder(column);
    }
  }
};
table.setRowSorter(sorter);
sorter.setSortKeys(Arrays.asList(new RowSorter.SortKey(1, SortOrder.DESCENDING)));
}}

**解説 [#d46c2258]
上記のサンプルでは、A.「viewRowIndex<5」をチェックすると、ソートされていても表示上の0から4行目までの5行のみ表示されるフィルタがかかります。
* 解説 [#explanation]
上記のサンプルでは、☑ `viewRowIndex<5`をチェックするとソート状態とは無関係に表示上の`0`から`4`行目までの`5`行のみ表示されるフィルタが掛かります。

- Costom Sorting チェック無し
-- Aのフィルタで「AA-ee」が表示されている場合、String列で昇順から降順にソートすると「ee-AA」となる
- `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`が表示される

- Costom Sorting チェック有り
-- Aのフィルタで「AA-ee」が表示されている場合、String列で昇順から降順にソートすると「OO-KK」となる
--- toggleSortOrder メソッドをオーバーライドして、一旦RowFilterを解除(setRowFilter(null))してから昇順から降順にソート「OO-KK-AA」、その後再びRowFilterを設定するので「OO-KK」が表示される
----
- 以下のように`toggleSortOrder`メソッドをオーバーライドし、すべての行が変更されている可能性があることをリスナーに通知してから再度ソートを実行する方法もある

----
以下、一旦RowFilterを解除して・・・ではなく、DefaultRowSorter#allRowsChanged() を使用する方法?です。
#code{{
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model) {
  @Override
  public void toggleSortOrder(int column) {
    if(check.isSelected()) {
      //((AbstractTableModel)table.getModel()).fireTableDataChanged();
      allRowsChanged();
      super.toggleSortOrder(column);
      allRowsChanged();
    }else{
      super.toggleSortOrder(column);
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();
    }
  }
};
}}

//**参考リンク
**コメント [#y76c22c5]
- もっと簡単な方法がありそう・・・。 -- [[aterai]] &new{2008-11-03 (月) 16:35:24};
* 参考リンク [#reference]
- [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