JTable内のチェックされた行のみ別のJTableに表示するフィルタを作成する
Total: 3509
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
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()
を実行してフィルタリングの更新を行う