---
category: swing
folder: MultisortHeaderRenderer
title: JTableの複数キーを使ったソートをヘッダに表示する
tags: [JTable, JTableHeader, TableRowSorter, Icon]
author: aterai
pubdate: 2013-10-14T00:15:08+09:00
description: JTableの複数キーを使ったソートの状態をヘッダ上に別途表示します。
image: https://lh3.googleusercontent.com/-QNe3lJ3oXH0/Ulqu3vaS91I/AAAAAAAAB3U/Tb2kXiKV8Fs/s800/MultisortHeaderRenderer.png
---
* 概要 [#summary]
`JTable`の複数キーを使ったソートの状態をヘッダ上に別途表示します。

#download(https://lh3.googleusercontent.com/-QNe3lJ3oXH0/Ulqu3vaS91I/AAAAAAAAB3U/Tb2kXiKV8Fs/s800/MultisortHeaderRenderer.png)

* サンプルコード [#sourcecode]
#code(link){{
class MultisortHeaderRenderer implements TableCellRenderer {
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus,
      int row, int column) {
    String str = Objects.toString(value, "");
    RowSorter<? extends TableModel> sorter = table.getRowSorter();
    if (Objects.nonNull(sorter)) {
      List<? extends TableRowSorter.SortKey> keys = sorter.getSortKeys();
      for (int i = 0; i < keys.size(); i++) {
        TableRowSorter.SortKey sortKey = keys.get(i);
        if (column == sortKey.getColumn()) {
          String k = sortKey.getSortOrder() == SortOrder.ASCENDING ? "\u25B4 "
                                                                   : "\u25BE ";
          String k = sortKey.getSortOrder() == SortOrder.ASCENDING ? "\u25B4 " : "\u25BE ";
          str = String.format("<html>%s<small color='gray'>%s%d", str, k, i + 1);
        }
      }
    }
    TableCellRenderer r = table.getTableHeader().getDefaultRenderer();
    return r.getTableCellRendererComponent(
        table, str, isSelected, hasFocus, row, column);
  }
}
}}

* 解説 [#explanation]
- デフォルト
-- `JTable`の`TableRowSorter`は、デフォルトで最大数`3`の`SortKey`が設定可能
-- このため複数キーを使ったソートを実行できる
-- ただしソートアイコンは第`1`ソートキーの状態のみ`JTableHeader`に表示される
- 上記サンプル
-- `JTableHeader`のセルレンダラーでソートキーを取得し、その状態を文字列にしてヘッダタイトルに追記表示することで存在するソートキーをすべて表示

----
- [https://tips4java.wordpress.com/2010/08/29/multisort-table-header-cell-renderer/ Multisort Table Header Cell Renderer « Java Tips Weblog]
-- 第`2`キー以下を薄く表示するサンプル
-- `Windows 7`でデフォルトの`WindowsLookAndFeel`が使用するヘッダセルレンダラー(ソートのマークが文字列の右ではなく上部に表示される)と併用したい場合は修正が必要
--- この修正を行ったレンダラーを他の`LookAndFeel`で使用すると第`1`ソートキーが非表示になる

* 参考リンク [#reference]
- [https://tips4java.wordpress.com/2010/08/29/multisort-table-header-cell-renderer/ Multisort Table Header Cell Renderer « Java Tips Weblog]
- [[TableRowSorterでJTableのソート>Swing/TableRowSorter]]
- [[JTableのソートアイコンを変更>Swing/TableSortIcon]]

* コメント [#comment]
#comment
#comment