JTableのRowFilterを一旦解除してソート
Total: 10401, Today: 1, Yesterday: 1
Posted by aterai at
Last-modified:
Summary
JTableのRowFilterを一旦解除してソートし、再びフィルタを設定することで表示される行を更新します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
上記のサンプルでは、☑ 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();
}
}
};
Reference
- Specification for the javax.swing.DefaultRowSorter.setSortsOnUpdates/rowsUpdated method is not clear