Swing/ResetRowFilter のバックアップの現在との差分(No.17)
- category: swing
folder: ResetRowFilter
title: JTableのRowFilterを一旦解除してソート
tags: [JTable, RowFilter, TableRowSorter]
author: aterai
pubdate: 2008-11-03T16:35:24+09:00
description: JTableのRowFilterを一旦解除してソートし、再びフィルタを設定することで表示される行を更新します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2009/03/reset-rowfilter-before-sorting.html lang: en
概要
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#setRowFilter(null)
を実行し、RowFilter
を解除してから昇順から降順にソートOO-KK-AA
、その後再びRowFilter
を設定するとOO-KK
が表示される
-
- ☑
以下は、
toggleSortOrder
メソッドをオーバーライドしすべての行が変更されている可能性があることをリスナーに通知してからもう一度ソートのやり直しを行う方法です。
- 以下のように
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
- Specification for the javax.swing.DefaultRowSorter.setSortsOnUpdates/rowsUpdated method is not clear