TITLE:JTableのRowFilterを一旦解除してソート

Posted by at 2008-11-03

JTableのRowFilterを一旦解除してソート

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

  • &jnlp;
  • &jar;
  • &zip;
ResetRowFilter.png

サンプルコード

final 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;
  }
};
final 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

解説

上記のサンプルでは、A.「viewRowIndex<5」をチェックすると、ソートされていても表示上の0から4行目までの5行のみ表示されるフィルタがかかります。

  • Costom Sorting チェック無し
    • Aのフィルタで「AA-ee」が表示されている場合、String列で昇順から降順にソートすると「ee-AA」となる
  • Costom Sorting チェック有り
    • Aのフィルタで「AA-ee」が表示されている場合、String列で昇順から降順にソートすると「OO-KK」となる
      • toggleSortOrder メソッドをオーバーライドして、一旦RowFilterを解除(setRowFilter(null))してから昇順から降順にソート「OO-KK-AA」、その後再びRowFilterを設定するので「OO-KK」が表示される

以下は、toggleSortOrder メソッドをオーバーライドし、すべての行が変更されている可能性があることをリスナーに通知してから、もう一度ソートのやり直しを行う方法です。

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

参考リンク

コメント

  • もっと簡単な方法がありそう・・・。 -- aterai