JTableの行を複数条件でソートする
Total: 941
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTable
の列に複数のソートキーを使用するComparator
を設定して複合ソートを実行します。
Screenshot
Advertisement
サンプルコード
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
で比較するよう設定している
- たとえば