Swing/RowFilter のバックアップの現在との差分(No.11)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - 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の行をフィルタリング #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