Swing/CheckBoxRowFilter のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/CheckBoxRowFilter へ行く。
- 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?export=view&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(...)
をオーバーライドして編集不可に設定Boolean
値を持つモデルの0
列目(表示はJCheckBox
)をTableColumnModel#removeColumn(...)
メソッドで非表示に設定RowFilter#include(...)
をオーバーライドして、0
列目の値がBoolean.TRUE
の場合、その行を表示するRowFilter
を作成して設定
- 共有の
TableModel
:TableModelListener
を設定し、JCheckBox
の選択などでモデルが更新された場合、TableRowSorter#allRowsChanged()
を実行してフィルタリングの更新を行う