概要

JTableの複数キーを使ったソートの状態をヘッダ上に別途表示します。

サンプルコード

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 ";
          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);
  }
}
View in GitHub: Java, Kotlin

解説

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

  • Multisort Table Header Cell Renderer « Java Tips Weblog
    • 2キー以下を薄く表示するサンプル
    • Windows 7でデフォルトのWindowsLookAndFeelが使用するヘッダセルレンダラー(ソートのマークが文字列の右ではなく上部に表示される)と併用したい場合は修正が必要
      • この修正を行ったレンダラーを他のLookAndFeelで使用すると第1ソートキーが非表示になる

参考リンク

コメント