Swing/RowFilter のバックアップの現在との差分(No.9)
TITLE:RowFilterでJTableの行をフィルタリング
Posted by terai at 2007-09-03
RowFilterでJTableの行をフィルタリング
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:
概要
JDK 6
で導入されたTableRowSorter
にRowFilter
を設定して、行のフィルタリングを行います。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spandel
final TableRowSorter<TestModel> sorter = new TableRowSorter<TestModel>(model);
#spanend
#spandel
final Set<RowFilter<TestModel,Integer>> filters = new HashSet<RowFilter<TestModel,Integer>>(2);
#spanend
#spandel
final RowFilter<TestModel,Integer> filter1 = new RowFilter<TestModel,Integer>() {
#spanend
@Override
public boolean include(Entry<? extends TestModel, ? extends Integer> entry) {
TestModel model = entry.getModel();
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
TableRowSorter<? extends TableModel> sorter = new TableRowSorter<>(model);
#spanend
#spanadd
Collection<RowFilter<? super TestModel, ? super Integer>> filters = new HashSet<>(2);
#spanend
#spanadd
RowFilter<TableModel, Integer> filter1 = new RowFilter<TableModel, Integer>() {
#spanend
@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();
}
};
#spandel
final RowFilter<TestModel,Integer> filter2 = new RowFilter<TestModel,Integer>() {
#spanend
@Override
public boolean include(Entry<? extends TestModel, ? extends Integer> entry) {
#spanadd
RowFilter<TableModel, Integer> filter2 = new RowFilter<TableModel, Integer>() {
#spanend
@Override public boolean include(
Entry<? extends TableModel, ? extends Integer> entry) {
return entry.getIdentifier() % 2 == 0;
}
};
sorter.setRowFilter(RowFilter.andFilter(filters));
//sorter.setRowFilter(filter1);
解説
上記のサンプルは、以下のような複数の行フィルタを、and条件でJTableに適用することができます。- コメントが空でない行のみ表示
- 行番号が偶数の場合のみ表示
- 行番号はソートされている場合でも、元のモデルのインデックスで判断する
解説
上記のサンプルは、以下のような複数の行フィルタをand
条件で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
- メモ:Swing - TableRowSorter && IndexOutOfBound DefaultTableModelと相性が悪いのかも。 -- terai
#spanend #spandel import java.awt.*; #spanend #spandel import java.awt.event.*; #spanend #spandel import javax.swing.*; #spanend #spandel import javax.swing.table.*; #spanend #spandel public class RowSorterTest extends JPanel{ #spanend 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)); } 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); } #spandel } #spanend #spandel
- メモ: TableRowSorterばっかりみてて、RowSorter (Java Platform SE 6)見てなかった。上の件は、以下と関係ありそう? -- terai
- RowSorter の具象実装は、TableModel、ListModel などのモデルを参照する必要があります。JTable や JList などのビュークラスも、モデルを参照します。順序の依存性を回避するため、RowSorter 実装がモデル上にリスナーをインストールしないようにしてください。モデルが変更されると、ビュークラスが RowSorter を呼び出します。たとえば、TableModel JTable で行が更新された場合、 rowsUpdated が呼び出されます。モデルが変更されると、ビューは、 modelStructureChanged、allRowsChanged、rowsInserted、rowsDeleted、rowsUpdated のいずれかのメソッドを呼び出します。
参考リンク
- Splash Screens and Java SE 6, and Sorting and Filtering Tables Tech Tips
- Sorting and Filtering (How to Use Tables)
- TableRowSorter (Java Platform SE 8)