TITLE:TableRowSorterでJTableのソート

TableRowSorterでJTableのソート

編集者:Terai Atsuhiro
作成日:2007-02-12
更新日:2022-10-14 (金) 13:42:44

概要

JDK 6 で導入された、TableRowSorterを利用して、JTableの行を降順、昇順にソートします。

#screenshot

サンプルコード

TestModel model = new TestModel();
JTable table = new JTable(model);
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
  • &jnlp;
  • &jar;
  • &zip;

解説

JDK 6 では、JTableにTableRowSorterを設定することで、カラムヘッダのクリックによる行ソートが行えます。

TableRowSorterのデフォルトでは、ヘッダクリックで(降順、昇順)とソートが切り替わり、TableSorterのように(降順、昇順、初期状態)ではなくなっています*1。上記のサンプルでは、ボタンをクリックすると、DefaultRowSorter#setSortKeys(List)にnullを代入することで初期状態に戻るようにしています。SwingLabsのJXTableみたいにShift+ヘッダクリックで初期状態に戻るようにしてもいいかもしれません(参考:TableRowSorterのSortKeysをクリアする)。

また、DefaultRowSorter#setSortable(int, boolean)でソートしたくないカラムを以前より簡単に指定できます(参考:JTableHeaderのカラムを選択不可にする)。

第二キーを使ったソートはTableRowSorter版では出来ない?ようなので、TableSorter.javaを使う場合もまだあるかもしれません。 複数キーを使ったソートも可能です。デフォルトではソートキーは3つまで、クリックした順に保持(ヘッダに表示されるのは最新のソートキーのみ)されるようです。詳しくはドキュメントやTableの内容をソートなどを参照してください。

参考リンク

コメント

  • DefaultRowSorter#setMaxSortKeys(int)で複数のキーを用いたソートも出来ているように思います(b86)。ただ、ヘッダー部分がわかりにくいですが。 -- syo
    • ご指摘ありがとうございます。なるほど、こちら(Tableの内容をソート)を使えばうまくいきそうですね。 -- terai
  • rendererがないので、基本的に数字は左揃え、文字列は右揃えで、中央揃えするにはどうすれば宜しいでしょうか? -- パンダ
    • このサンプルで特にセルレンダラーを設定していないのに、数字右揃え、文字列左揃えになってるのは、デフォルトのセルレンダラーが使われているためです。それはそのままで、2列目(コメントの列)だけを中揃えにしたい場合は、例えば以下のようにカラムに中揃えするためのセルレンダラーを設定する方法があります。 -- terai
      DefaultTableCellRenderer r = new DefaultTableCellRenderer();
      r.setHorizontalAlignment(JLabel.CENTER);
      table.getColumnModel().getColumn(2).setCellRenderer(r);