• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:RowFilterでJTableの行をフィルタリング
#navi(../)
RIGHT:Posted by [[aterai]] at 2007-09-03
*RowFilterでJTableの行をフィルタリング [#k5e18a60]
JDK 6 で導入されたTableRowSorterにRowFilterを設定して、行のフィルタリングを行います。
---
category: swing
folder: RowFilter
title: RowFilterでJTableの行をフィルタリング
tags: [JTable, TableRowSorter, RowFilter]
author: aterai
pubdate: 2007-09-03T15:45:16+09:00
description: JDK 6で導入されたTableRowSorterにRowFilterを設定して、行のフィルタリングを行います。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTST-FvjRI/AAAAAAAAAik/ZbU9nuVVCiI/s800/RowFilter.png
---
* 概要 [#summary]
`JDK 6`で導入された`TableRowSorter`に`RowFilter`を設定して、行のフィルタリングを行います。

-&jnlp;
-&jar;
-&zip;
#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTST-FvjRI/AAAAAAAAAik/ZbU9nuVVCiI/s800/RowFilter.png)

//#screenshot
#ref(http://lh3.ggpht.com/_9Z4BYR88imo/TQTST-FvjRI/AAAAAAAAAik/ZbU9nuVVCiI/s800/RowFilter.png)

**サンプルコード [#n69c6a49]
#code{{
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) {
* サンプルコード [#sourcecode]
#code(link){{
TableRowSorter<? extends TableModel> sorter = new TableRowSorter<>(model);
Collection<RowFilter<? super TestModel, ? super Integer>> filters = new HashSet<>(2);
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) {
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に適用することができます。
-コメントが空でない行のみ表示
-行番号が偶数の場合のみ表示
--行番号はソートされている場合でも、元のモデルのインデックスで判断する
* 解説 [#explanation]
上記のサンプルは、以下のような複数の行フィルタを`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://java.sun.com/docs/books/tutorial/uiswing/components/table.html#sorting Sorting and Filtering (How to Use Tables)]
- コメント列の値が空でない行のみ表示
- 行番号が偶数の場合のみ表示
-- 行番号はソートされている場合でも元のモデルのインデックスで判断する

**コメント [#p94b744a]
- (1.6.0_02) modelに要素を追加する前にtable.setRowSorter(sorter);しておかないと、IndexOutOfBoundsException: Invalid range が、モデルへの追加、削除、編集中に別の行クリックなどで発生する? -- [[aterai]] &new{2007-09-03 (月) 15:45:16};
- メモ:[http://forums.sun.com/thread.jspa?threadID=5168768 Swing - TableRowSorter && IndexOutOfBound] DefaultTableModelと相性が悪いのかも。 -- [[aterai]] &new{2007-09-12 (水) 17:52:39};
#code{{
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class RowSorterTest extends JPanel{
  public RowSorterTest() {
    super(new BorderLayout());
    final DefaultTableModel model = new DefaultTableModel(null, new String[] {"A","B","C"});
    JTable table = new JTable(model);
    TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
    //table.setRowSorter(sorter); // OK
    model.addRow(new String[] {"aa", "bb", "cc"});
    model.addRow(new String[] {"dd", "ee", "ff"});
    table.setRowSorter(sorter); // IndexOutOfBoundsException: Invalid range
    add(new JButton(new AbstractAction("model.addRow(...); -> IndexOutOfBoundsException") {
      @Override public void actionPerformed(ActionEvent e) {
        model.addRow(new String[] {"gg", "hh", "ii"});
      }
    }), BorderLayout.SOUTH);
    add(new JScrollPane(table));
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() { createAndShowGUI(); }
    });
  }
  public static void createAndShowGUI() {
    JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().add(new RowSorterTest());
    frame.setSize(320,240);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}
}}
- メモ: TableRowSorterばっかりみてて、[http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/RowSorter.html RowSorter (Java Platform SE 6)]見てなかった。上の件は、以下と関係ありそう? -- [[aterai]] &new{2007-10-18 (木) 22:21:55};
-- RowSorter の具象実装は、TableModel、ListModel などのモデルを参照する必要があります。JTable や JList などのビュークラスも、モデルを参照します。順序の依存性を回避するため、RowSorter 実装がモデル上にリスナーをインストールしないようにしてください。モデルが変更されると、ビュークラスが RowSorter を呼び出します。たとえば、TableModel JTable で行が更新された場合、 rowsUpdated が呼び出されます。モデルが変更されると、ビューは、 modelStructureChanged、allRowsChanged、rowsInserted、rowsDeleted、rowsUpdated のいずれかのメソッドを呼び出します。
* 参考リンク [#reference]
- [http://web.archive.org/web/20090419180550/http://java.sun.com/developer/JDCTechTips/2005/tt1115.html Splash Screens and Java SE 6, and Sorting and Filtering Tables Tech Tips]
- [https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting Sorting and Filtering (How to Use Tables)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/table/TableRowSorter.html TableRowSorter (Java Platform SE 8)]

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

#comment