TITLE:RowFilterでJTableの行をフィルタリング
#navi(../)
#tags(JTable, TableRowSorter, RowFilter)
RIGHT:Posted by &author(aterai); at 2007-09-03
* RowFilterでJTableの行をフィルタリング [#k5e18a60]
``JDK 6``で導入された``TableRowSorter``に``RowFilter``を設定して、行のフィルタリングを行います。

- &jnlp;
- &jar;
- &zip;

#ref(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTST-FvjRI/AAAAAAAAAik/ZbU9nuVVCiI/s800/RowFilter.png)

** サンプルコード [#n69c6a49]
#code(link){{
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
final Set<RowFilter<TableModel,Integer>> filters = new HashSet<RowFilter<TableModel,Integer>>(2);
final RowFilter<TableModel,Integer> filter1 = new RowFilter<TableModel,Integer>() {
  @Override public boolean include(
      Entry<? extends TableModel, ? extends Integer> entry) {
    TableModel model = entry.getModel();
    Test t = model.getTest(entry.getIdentifier());
    return !t.getComment().trim().isEmpty();
  }
};
final RowFilter<TableModel,Integer> filter2 = new RowFilter<TableModel,Integer>() {
  @Override public boolean include(
      Entry<? extends TableModel, ? extends Integer> entry) {
    return entry.getIdentifier() % 2 == 0;
  }
};
sorter.setRowFilter(RowFilter.andFilter(filters));
//sorter.setRowFilter(filter1);
}}

** 解説 [#xc758c87]
上記のサンプルは、以下のような複数の行フィルタを、``and``条件で``JTable``に適用することができます。

- コメントが空でない行のみ表示
- 行番号が偶数の場合のみ表示
-- 行番号はソートされている場合でも、元のモデルのインデックスで判断する

** 参考リンク [#d5eabb84]
- [http://java.sun.com/developer/JDCTechTips/2005/tt1115.html#2 Splash Screens and Java SE 6, and Sorting and Filtering Tables Tech Tips]
- [http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting Sorting and Filtering (How to Use Tables)]

** コメント [#p94b744a]
- 「``IndexOutOfBoundsException``が発生する…」は、[[TableRowSorterでJTableのソート>Swing/TableRowSorter]]に移動しました。 -- [[aterai]] &new{2011-02-04 (金) 15:19:12};

#comment