人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javaでプログラミングしています。java6です。
SwingのJTableのソート機能を

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

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

●質問者: Gakuen
●カテゴリ:コンピュータ
✍キーワード:Java Swing いるか ソート プログラミング
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● moom0906
●40ポイント ベストアンサー

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

推察のとおり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が使用され数値順に並ぶはずです。

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

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

◎質問者からの返答

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

試してみます。


2 ● lunlumo
●40ポイント

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...

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ