• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:TableRowSorterのソートをヘッダクリックで昇順、降順、初期状態に変更
#navi(../)
*TableRowSorterのソートをヘッダクリックで昇順、降順、初期状態に変更 [#qcd17147]
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
---
* 概要 [#summary]
`JDK 6`で導入された`TableRowSorter`のソートを、`TableSorter.java`のようにヘッダクリックで昇順、降順、初期状態に切り替わるように設定します。

#contents
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTWVWrGvdI/AAAAAAAAApE/-DL1kAZzGsM/s800/TriStateSorting.png)

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

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#l29c9a20]
#code{{
TestModel model = new TestModel();
* サンプルコード [#sourcecode]
#code(link){{
TableModel model = makeTestTableModel();
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);
}}

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

**参考リンク [#qf7f31ba]
-[[TableRowSorterでJTableのソート>Swing/TableRowSorter]]
-[[TableRowSorterのSortKeysをクリアする>Swing/ClearSortingState]]
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/DefaultRowSorter.html#toggleSortOrder-int- DefaultRowSorter#toggleSortOrder(int) (Java Platform SE 8)]
- [[TableRowSorterでJTableのソート>Swing/TableRowSorter]]
- [[TableRowSorterのSortKeysをクリアする>Swing/ClearSortingState]]
- [https://java-swing-tips.blogspot.com/2017/08/apply-sort-order-cycle-with-ascending.html Java Swing Tips: Apply sort order cycle with ascending, descending, and unsorted in TableRowSorter with multi-key sorting]
-- `setSortKeys(null)`ですべてのソートキーをクリアするのではなく、他のソートキーは維持したまま昇順、降順、初期状態を遷移するサンプル(ssrさんがメールで投稿)

**コメント [#s4c0fcaa]
* コメント [#comment]
#comment
- スクリーンショットを更新 -- &user(aterai); &new{2008-09-25 (木) 14:23:27};

#comment