torutkのブログ

ソフトウェア・エンジニアのブログ

Java Swing JTableのソート機能

JTableを使って計測ツールの出力結果をGUI化しようとした際に、JTableにはソート機能がないことが分かりました。有名な問題のようですね。インターネットを調べてみると、以下のblogでSort機能を付加する情報が紹介されていました。
http://blog2.fc2.com/hightide/blog-entry-32.html

SunのSwingチュートリアル書籍(オンライン)において、TableModelをデコレータで包むTableSorterのサンプルコードが紹介されています。
How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
ソースコードはこちら
http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/TableSorter.java

TableSorterを入手して使用すると、テーブルのヘッダーをクリックしてその列についてソートする機能が組み込まれます。デコレータ・パターンを使用しているので、既存のTableModelをラップしてJTableにセットするだけで機能が利用できます。

また、上述blogで追加紹介しているページ
http://www.cpcug.org/user/kbennett/articles/tablesorter/table-sorter-article.html
では、Sunのチュートリアルのサンプルに欠けている機能を追加したNewTableSorterを公開しています。

  • 大文字・小文字を区別しないソート対応
  • CollatorによるASCII以外の文字ソート対応
  • ソート時にヘッダーに表示する△▽マークをくっきり(塗りつぶし)表示

使ってみると、整数のソートにおいて、数値順ではなく数値の文字列順にソートされてしまう問題があります。TableModelのgetValueAtがObject型を返すので、intの値がAutoboxingでInteger型で渡されているはずです(JDK1.5 Tiger)。要調査。