TITLE:TableRowSorterのソートをヘッダクリックで昇順、降順、初期状態に変更

TableRowSorterのソートをヘッダクリックで昇順、降順、初期状態に変更

Posted by terai at 2008-09-15
  • category: swing folder: TriStateSorting title: TableRowSorterのソートをヘッダクリックで昇順、降順、初期状態に変更 tags: [JTable, TableRowSorter] author: aterai pubdate: 2008-09-15T17:36:51+09:00 description: JDK 6で導入されたTableRowSorterのソートを、TableSorter.javaのようにヘッダクリックで昇順、降順、初期状態に切り替わるように設定します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTWVWrGvdI/AAAAAAAAApE/-DL1kAZzGsM/s800/TriStateSorting.png hreflang:
       href: https://java-swing-tips.blogspot.com/2008/09/jdk6-cycle-through-ascending-descending.html
       lang: en

概要

JDK 6で導入されたTableRowSorterのソートを、TableSorter.javaのようにヘッダクリックで昇順、降順、初期状態に切り替わるように設定します。

概要

JDK 6 で導入された TableRowSorter のソートを、TableSorter.java のようにヘッダクリックで昇順、降順、初期状態に切り替わるように設定します。
  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

#spanend
#spandel
TestModel model = new TestModel();
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
TableModel model = makeTestTableModel();
#spanend
JTable table = new JTable(model);
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model) {
  @Override
  public void toggleSortOrder(int column) {
    if(column>=0 && column<getModelWrapper().getColumnCount() && isSortable(column)) {
      List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
      if(!keys.isEmpty()) {
  @Override public void toggleSortOrder(int column) {
    if (column >= 0 && column < getModelWrapper().getColumnCount() && isSortable(column)) {
      List<SortKey> keys = new ArrayList<>(getSortKeys());
      if (!keys.isEmpty()) {
        SortKey sortKey = keys.get(0);
        if(sortKey.getColumn()==column && sortKey.getSortOrder()==SortOrder.DESCENDING) {
        if (sortKey.getColumn() == column && sortKey.getSortOrder() == SortOrder.DESCENDING) {
          setSortKeys(null);
          return;
        }
      }
    }
    super.toggleSortOrder(column);
  }
};
table.setRowSorter(sorter);

解説

上記のサンプルでは、TableRowSorter#toggleSortOrder(int) をオーバーライドして、クリックした列がソートの第一キーで、ソート順序が DESCENDING の場合、ソートキーをクリアすることで昇順(ASCENDING)、降順(DESCENDING)、初期状態(UNSORTED)と遷移しているように見せかけています。

解説

上記のサンプルでは、TableRowSorter#toggleSortOrder(int)メソッドをオーバーライドして、クリックした列がソートの第1キー、かつソート順序がDESCENDINGの場合はソートキーをクリアしています。このため同じカラムヘッダを連続して3回クリックすると昇順(ASCENDING)、降順(DESCENDING)、初期状態(UNSORTED)と遷移して元の状態に戻ります。

参考リンク

参考リンク

コメント

コメント