Javaでプログラミングしています。java6です。

SwingのJTableのソート機能を

RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel1);
jTable1.setRowSorter(sorter);

として加えました。しかし、実際にソートしてみると文字列のソートは思ったとおりに動いてくれるのですが、数値のソートが思い通りに動いてくれません。おそらく数値も文字としてソートしているからだと思います。(5,1,10,14であれば1,5,10,14としたい)
どのようにすれば、数値順にソートするようにできますでしょうか。

回答の条件
  • 1人2回まで
  • 登録:2009/01/07 23:28:34
  • 終了:2009/01/08 18:22:23

ベストアンサー

id:moom0906 No.1

moom0906回答回数9ベストアンサー獲得回数12009/01/08 02:54:37

ポイント40pt

実際に試して見ればよいのですが、おそらく解決策になる情報を記述します。

推察のとおりTableRowSorterはTableModelで定義されたカラム情報のとおりにソートしますので、もし、DefaultTableModelを使用しているのであれば、デフォルトであるObject型でソートされます。

これを数値型にする際には、TableModelを作成する際に各カラムのデータ型を返却するメソッド(public Class getColumnClass(int columnIndex))をオーバーライドすることによって対応できるかと思います。

上のサンプルで「tableModel1」の編集のオブジェクトを作る際に、

DefaultTableModelを使用しているのであれば、

次のような感じでクラスをつくるか、

public class SampleTableModel extends DefaultTableModel
{
    public Class getColumnClass(int columnIndex)
    {
        return Integer.class;
    }
}

もしくは、インスタンス生成時に指定

TableModel tableModel1 = new DefaultTableModel()
{
    public Class getColumnClass(int columnIndex)
    {
        return Integer.class;
    }
};

などの方法を使用して各カラムのデータ型を返却します。

上記はどのカラムのデータもすべて数値の場合です。

カラムによってデータ型を変える場合はそのようにメソッドの中を変更する必要があります。

詳細は以下のURLに書かれています

http://java.sun.com/docs/books/tutorial/uiswing/components/table...

(英語ですが・・・・)


上記のようにして数値型であるクラスを返却することによって、数値用のComparatorが使用され

数値によるソートが実行されます。

なお、TableRowSorterを使用した場合、TableModelに定義された状態によってどのようにソートされるか細かく書いてありますのでそちらを参考にされてもよいでしょう。

http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/table/Ta...

上記のようにIntegerクラスを返すようにしておけば、

「3. 列クラスが Comparable を実装する場合は、compareTo メソッドを呼び出す Comparator を使用します。 」

が適用されて、Integer用のComparatorが使用され数値順に並ぶはずです。

実際にサンプル等で確認すればよいのですが、試してみていただけますか?

誤っていた場合はすいません・・・

id:Gakuen

ありがとうございました。

試してみます。

2009/01/08 18:21:33

その他の回答(1件)

id:moom0906 No.1

moom0906回答回数9ベストアンサー獲得回数12009/01/08 02:54:37ここでベストアンサー

ポイント40pt

実際に試して見ればよいのですが、おそらく解決策になる情報を記述します。

推察のとおりTableRowSorterはTableModelで定義されたカラム情報のとおりにソートしますので、もし、DefaultTableModelを使用しているのであれば、デフォルトであるObject型でソートされます。

これを数値型にする際には、TableModelを作成する際に各カラムのデータ型を返却するメソッド(public Class getColumnClass(int columnIndex))をオーバーライドすることによって対応できるかと思います。

上のサンプルで「tableModel1」の編集のオブジェクトを作る際に、

DefaultTableModelを使用しているのであれば、

次のような感じでクラスをつくるか、

public class SampleTableModel extends DefaultTableModel
{
    public Class getColumnClass(int columnIndex)
    {
        return Integer.class;
    }
}

もしくは、インスタンス生成時に指定

TableModel tableModel1 = new DefaultTableModel()
{
    public Class getColumnClass(int columnIndex)
    {
        return Integer.class;
    }
};

などの方法を使用して各カラムのデータ型を返却します。

上記はどのカラムのデータもすべて数値の場合です。

カラムによってデータ型を変える場合はそのようにメソッドの中を変更する必要があります。

詳細は以下のURLに書かれています

http://java.sun.com/docs/books/tutorial/uiswing/components/table...

(英語ですが・・・・)


上記のようにして数値型であるクラスを返却することによって、数値用のComparatorが使用され

数値によるソートが実行されます。

なお、TableRowSorterを使用した場合、TableModelに定義された状態によってどのようにソートされるか細かく書いてありますのでそちらを参考にされてもよいでしょう。

http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/table/Ta...

上記のようにIntegerクラスを返すようにしておけば、

「3. 列クラスが Comparable を実装する場合は、compareTo メソッドを呼び出す Comparator を使用します。 」

が適用されて、Integer用のComparatorが使用され数値順に並ぶはずです。

実際にサンプル等で確認すればよいのですが、試してみていただけますか?

誤っていた場合はすいません・・・

id:Gakuen

ありがとうございました。

試してみます。

2009/01/08 18:21:33
id:lunlumo No.2

lunlumo回答回数107ベストアンサー獲得回数142009/01/08 03:05:50

ポイント40pt

 DefaultRowSorter#setComparatorでソートに使用するComparatorが指定できる様です。以下,先頭のカラムを数値としてソートするサンプルです。

import java.awt.BorderLayout;
import java.util.Comparator;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;

public class TableSorterTest extends JFrame {

  private String[] columns = {"key", "value"};
  private String[][] data = {
      {"10", "試験"},
      {"1", "test"},
      {"9", "てすと"},
      {"3", "テスト"}
    };

  public TableSorterTest(String title) {
    initComponents();
    setTitle(title);
    setSize(300, 200);
  }

  private void initComponents() {
    DefaultTableModel model = new DefaultTableModel(columns, 0);
    TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(model);
    JTable table = new JTable(model);

    sorter.setComparator(0, new Comparator<String>() {
        public int compare(String a, String b) {
          return Integer.parseInt(a) - Integer.parseInt(b);
        }
      });

    table.setRowSorter(sorter);

    for(int i = 0; i < data.length; i++){
      model.addRow(data[i]);
    }

    getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
  }

  public static void main(String[] args) {
    TableSorterTest test = new TableSorterTest("TableSorterTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

}

http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/table/Ta...

id:Gakuen

ありがとうございました。

サンプルまでご用意していただいて、ありがたいです。

2009/01/08 18:22:00

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません