JTableのRowFilterを一旦解除してソート
Total: 9993
, Today: 4
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTable
のRowFilter
を一旦解除してソートし、再びフィルタを設定することで表示される行を更新します。
Screenshot
Advertisement
サンプルコード
RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() {
@Override public boolean include(Entry<? extends TableModel, ? extends Integer> entry) {
int vidx = table.convertRowIndexToView(entry.getIdentifier());
return vidx < USER_SPECIFIED_NUMBER_OF_ROWS;
}
};
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model) {
@Override public void toggleSortOrder(int column) {
if (check.isSelected()) {
RowFilter<? super TableModel, ? super Integer> f = getRowFilter();
setRowFilter(null);
super.toggleSortOrder(column);
setRowFilter(f);
} else {
super.toggleSortOrder(column);
}
}
};
table.setRowSorter(sorter);
sorter.setSortKeys(Arrays.asList(new RowSorter.SortKey(1, SortOrder.DESCENDING)));
View in GitHub: Java, Kotlin解説
上記のサンプルでは、☑ viewRowIndex<5
をチェックするとソート状態とは無関係に表示上の0
から4
行目までの5
行のみ表示されるフィルタが掛かります。
Custom Sorting
チェック無し- ☑
viewRowIndex<5
のフィルタでAA-ee
が表示されている場合、String
列で昇順から降順にソートするとee-AA
となる
- ☑
Custom Sorting
チェック有り- ☑
viewRowIndex<5
のフィルタでAA-ee
が表示されている場合、String
列で昇順から降順にソートするとOO-KK
となるtoggleSortOrder
メソッドをオーバーライドして一旦TableRowSorter#setRowFilter(null)
を実行し、RowFilter
を解除してから昇順から降順にソートOO-KK-AA
、その後再びRowFilter
を設定するとOO-KK
が表示される
- ☑
- 以下のように
toggleSortOrder
メソッドをオーバーライドし、すべての行が変更されている可能性があることをリスナーに通知してから再度ソートを実行する方法もある
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model) {
@Override public void toggleSortOrder(int column) {
super.toggleSortOrder(column);
if (check.isSelected()) {
model.fireTableDataChanged();
// ??? allRowsChanged();
// modelRowCount = getModelWrapper().getRowCount();
sort();
}
}
};
参考リンク
- Specification for the javax.swing.DefaultRowSorter.setSortsOnUpdates/rowsUpdated method is not clear