Swing/RowFilter のバックアップ(No.6)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/RowFilter へ行く。
- 1 (2007-09-03 (月) 15:45:16)
- 2 (2007-09-05 (水) 10:12:29)
- 3 (2007-09-05 (水) 18:01:52)
- 4 (2007-09-12 (水) 12:17:26)
- 5 (2007-09-12 (水) 17:52:39)
- 6 (2007-09-21 (金) 17:29:13)
- 7 (2007-10-18 (木) 22:21:55)
- 8 (2008-06-17 (火) 17:49:18)
- 9 (2010-10-28 (木) 18:03:31)
- 10 (2010-11-09 (火) 18:00:36)
- 11 (2011-02-04 (金) 15:19:02)
- 12 (2013-01-31 (木) 22:58:05)
- 13 (2013-09-21 (土) 20:39:55)
- 14 (2014-03-18 (火) 18:55:29)
- 15 (2015-03-12 (木) 15:10:25)
- 16 (2017-02-08 (水) 20:19:40)
- 17 (2017-04-04 (火) 14:17:08)
- 18 (2017-12-22 (金) 17:43:18)
- 19 (2018-10-25 (木) 17:40:42)
- 20 (2019-10-01 (火) 17:17:14)
- 21 (2021-05-11 (火) 01:25:32)
TITLE:RowFilterでJTableの行をフィルタリング
RowFilterでJTableの行をフィルタリング
編集者:Terai Atsuhiro
作成日:2007-09-03
更新日:2021-05-11 (火) 01:25:32
概要
JDK 6 で導入されたTableRowSorterにRowFilterを設定して、行のフィルタリングを行います。
#screenshot
サンプルコード
final TableRowSorter<TestModel> sorter = new TableRowSorter<TestModel>(model);
final Set<RowFilter<TestModel,Integer>> filters = new HashSet<RowFilter<TestModel,Integer>>(2);
final RowFilter<TestModel,Integer> filter1 = new RowFilter<TestModel,Integer>() {
@Override
public boolean include(Entry<? extends TestModel, ? extends Integer> entry) {
TestModel model = entry.getModel();
Test t = model.getTest(entry.getIdentifier());
return !t.getComment().trim().isEmpty();
}
};
final RowFilter<TestModel,Integer> filter2 = new RowFilter<TestModel,Integer>() {
@Override
public boolean include(Entry<? extends TestModel, ? extends Integer> entry) {
return entry.getIdentifier() % 2 == 0;
}
};
sorter.setRowFilter(RowFilter.andFilter(filters));
//sorter.setRowFilter(filter1);
- &jnlp;
- &jar;
- &zip;
解説
上記のサンプルは、以下のような行フィルタを、antでJTableに適用することができます。
- コメントが空でない行のみ表示
- 行番号が偶数の場合のみ表示
- 行番号はソートされている場合でも、元のモデルのインデックスで判断する
参考リンク
- Splash Screens and Java SE 6, and Sorting and Filtering Tables Tech Tips
- Sorting and Filtering (How to Use Tables)
コメント
- (1.6.0_02) modelに要素を追加する前にtable.setRowSorter(sorter);しておかないと、IndexOutOfBoundsException: Invalid range が、モデルへの追加、削除、編集中に別の行クリックなどで発生する? -- terai
- メモ:TableRowSorter && IndexOutOfBound DefaultTableModelと相性が悪いのかも。 -- terai
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[] {"aa","bb","cc"}); JTable table = new JTable(model); TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(model); //table.setRowSorter(sorter); // OK model.addRow(new String[] {"00", "00", "00"}); model.addRow(new String[] {"11", "11", "11"}); table.setRowSorter(sorter); // IndexOutOfBoundsException: Invalid range add(new JButton(new AbstractAction("model.addRow(...); -> IndexOutOfBoundsException") { @Override public void actionPerformed(ActionEvent e) { model.addRow(new String[] {"22", "22", "22"}); } }), BorderLayout.SOUTH); add(new JScrollPane(table), BorderLayout.CENTER); } 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.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }