Swing/CheckBoxRowFilter のバックアップ(No.8)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/CheckBoxRowFilter へ行く。
- 1 (2017-02-20 (月) 19:40:38)
- 2 (2017-02-28 (火) 17:51:53)
- 3 (2017-10-10 (火) 16:28:50)
- 4 (2018-02-15 (木) 14:23:42)
- 5 (2019-04-24 (水) 18:49:30)
- 6 (2021-02-02 (火) 08:04:36)
- 7 (2024-02-03 (土) 14:28:07)
- 8 (2025-01-03 (金) 08:57:02)
- 9 (2025-01-03 (金) 09:01:23)
- 10 (2025-01-03 (金) 09:02:38)
- 11 (2025-01-03 (金) 09:03:21)
- 12 (2025-01-03 (金) 09:04:02)
- 13 (2025-06-19 (木) 12:41:37)
- 14 (2025-06-19 (木) 12:43:47)
- category: swing folder: CheckBoxRowFilter title: JTable内のチェックされた行のみ別のJTableに表示するフィルタを作成する tags: [JTable, JCheckBox, RowFilter, TableRowSorter] author: aterai pubdate: 2016-08-29T01:50:21+09:00 description: JTableの各行に配置したJCheckBoxが選択されている場合、その行を別のJTableに表示するRowFilterを作成します。 image: https://drive.google.com/uc?id=1NvW9GHFg1_ENevzp5ohu8q4HugyKpkpZdw
概要
JTableの各行に配置したJCheckBoxが選択されている場合、その行を別のJTableに表示するRowFilterを作成します。
Screenshot

Advertisement
サンプルコード
TableModel model = new DefaultTableModel(data, columnNames) {
@Override public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
JTable selector = new JTable(model);
selector.setAutoCreateRowSorter(true);
selector.getColumnModel().getColumn(0).setMaxWidth(32);
JTable viewer = new JTable(model) {
@Override public boolean isCellEditable(int row, int column) {
return false;
}
};
viewer.setAutoCreateRowSorter(true);
TableColumnModel cm = viewer.getColumnModel();
cm.removeColumn(cm.getColumn(0));
TableRowSorter<TableModel> sorter = new TableRowSorter<>(model);
viewer.setRowSorter(sorter);
sorter.setRowFilter(new RowFilter<TableModel, Integer>() {
@Override public boolean include(
Entry<? extends TableModel, ? extends Integer> entry) {
return Objects.equals(entry.getModel().getValueAt(
entry.getIdentifier(), 0), Boolean.TRUE);
}
});
model.addTableModelListener(e -> {
if (e.getType() == TableModelEvent.UPDATE) {
sorter.allRowsChanged();
// sorter.modelStructureChanged();
}
});
View in GitHub: Java, Kotlin解説
上記のサンプルでは、選択用と表示用の2つのJTableを作成しています。どちらのJTableもモデルは同じものを共有していますが、以下のような異なる設定をしています。
- 選択用の
JTable:0列目の値(Boolean)をJCheckBoxで編集可能になるよう設定
- 表示用の
JTable:JTable#isCellEditable(...)をオーバーライドしてモデルではなくJTable側で編集不可を設定Boolean値を持つモデルの0列目(表示はJCheckBox)をTableColumnModel#removeColumn(...)メソッドで非表示に設定RowFilter#include(...)をオーバーライドして0列目の値がBoolean.TRUEの場合はその行を表示するRowFilterを作成して設定
- 共有の
TableModel:TableModelListenerを設定し、JCheckBoxの選択などでモデルが更新された場合はTableRowSorter#allRowsChanged()を実行してフィルタリングの更新を行う