概要

JTableRowFilterを一旦解除してソートし、再びフィルタを設定することで表示される行を更新します。

サンプルコード

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();
    }
  }
};

参考リンク

コメント