概要

JTableの列に複数のソートキーを使用するComparatorを設定して複合ソートを実行します。

サンプルコード

RowSorter<? extends TableModel> sorter = table.getRowSorter();
if (sorter instanceof TableRowSorter) {
  TableRowSorter<? extends TableModel> rs
      = (TableRowSorter<? extends TableModel>) sorter;
  rs.setComparator(0, Comparator.comparing(RowData::getPosition));
  rs.setComparator(1, Comparator.comparing(RowData::getTeam));
  rs.setComparator(2, Comparator.comparing(RowData::getMatches));
  rs.setComparator(3, Comparator.comparing(RowData::getWins));
  rs.setComparator(4, Comparator.comparing(RowData::getDraws));
  rs.setComparator(5, Comparator.comparing(RowData::getLosses));
  rs.setComparator(6, Comparator.comparing(RowData::getGoalsFor));
  rs.setComparator(7, Comparator.comparing(RowData::getGoalsAgainst));
  rs.setComparator(8, Comparator.comparing(RowData::getGoalDifference));
  rs.setComparator(9, Comparator.comparing(RowData::getPoints)
      .thenComparing(RowData::getGoalDifference));
}
add(new JScrollPane(table));
View in GitHub: Java, Kotlin

解説

  • JTableの水平罫線を描画する位置とその色をソート条件に応じて変更するに以下のような修正を追加して同様の列表示が可能な順位表を作成
    • 実際の順位やチーム名、勝ち点、得失点ではなく、これらをまとめたRowDataを以下のように列数分コピーしてDefaultTableModelを作成するよう変更
      • DefaultTableModel#addRow(Collections.nCopies(10, new RowData(1, "Team", 33, 20, 7, 6, 57, 27)).toArray());
    • DefaultTableModel#getColumnClass(int column)をオーバーライドして全セルのClass<?>RowData.classとなるよう設定
    • JTable#setDefaultRenderer(RowData.class, ...)で各列にはRowDataではなくRowDataから取得した順位やチーム名、勝ち点を表示するセルレンダラーを設定
  • TableRowSorter#setComparator(int column, Comparator<?> comparator)RowDataではなく列に対応した順位などをRowDataから取得してソートするComparatorを作成して設定
    • たとえば9列目の勝ち点用のComparatorはソートキーRowData::getPointsで比較し、さらに勝ち点が等しい場合は得失点差RowData::getGoalDifferenceで比較するよう設定している

参考リンク

コメント