2011-09-04 10 views
6

これに関連してかなりの質問がありましたが、私の問題には簡単な解決策が見つかりませんでした。JTableで二重値をソートする

JTableがDouble値を正しくソートする方法が見つかりません。

私はクラスの配列を受け取り、列ごとに適切なタイプを返すためにAbstractTableModelに拡張:

TableRowSorter<TableModelMod> sorter = new TableRowSorter<TableModelMod>((TableModelMod)getModel()); 

しかし、追加したとき、私はこのエラーを取得する:私のカスタムJTableのコンストラクタで

class TableModelMod extends AbstractTableModel{ 

    private ArrayList data; 
    private String [] headers; 
    private Class [] types; 

    TableModelMod(String [] heads, ArrayList datas, Class [] classes){ 
     headers = heads; 
     data = datas; 
     types = classes; 
    } 
    ... 
    @Override public Class getColumnClass(int c){ 
     if (c > types.length - 1) 
      return null; 
     else 
      return types[c]; 
    } 
... 

そしてを行:

java.lang.IllegalArgumentException: Cannot format given Object as a Number 

この方法では失敗しますDecimalFormat.format(Object number, StringBuffer toAppendTo, FieldPosition pos)ほとんどの数値型を受け取りますが、Doubleを受け取ります。

Double列に別のクラスを使用すると、エラーは発生しませんが、ソートは期待通りに機能しません。私は別の数値クラスで試してみましたが、どれもダブルス正しく並べ替えるように見えるん:

@Override public Class getColumnClass(int c){ 
    if (c > types.length - 1) 
     return null; 
    else if (types[c] == Double.class) 
     return Number.class; 
    else 
     return types[c]; 
} 

私は私が必要なものを私はカスタムのRowSorter、カスタムのCellRenderer、またはその両方を実装することであるかはわかりません。

これを簡単な方法で修正する方法を教えてもらえますか?

ありがとう、ありがとうございます。 EDITED

:それは問題があった場所伝えることは非常に恥ずかしいです

を解決しました。

Object []行を含むArrayListは、getObject(int)またはgetDouble(int)ではなくgetString(int)を使用してデータベースResultSetから塗りつぶされていたため、レンダラーによって値をDoubleとして使用できませんでした。それは、それが整数や数値を列クラスとして使用して例外を与えていない奇妙だが、それはとにかく文字列としてソートされていた。間違ったクラスの問題を探していたのは、私のArrayListにオブジェクトだけが含まれていると確信していたからです。

私のダブルスが実際にストリングスであることに気がついたので、あなたのサンプルを見ていただき、ありがとうございました。

+1

を掲載することを切り取りません。 – murgatroid99

答えて

6

このコードを確認してください。 double値をソートします。

enter image description here

enter image description here

import java.awt.BorderLayout; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.RowSorter; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class RowSorterDemo { 
    public static void main(String args[]) { 
    JFrame frame = new JFrame("Sort Table Demo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Object rows[][] = { { "J", 23.1 }, { "R", 21.1, }, { "E", 21.2, }, { "B", 27.1, }, { "A", 25.2, }, 
     { "S", 22.9, }, }; 

    String columns[] = { "Name", "Age" }; 

    TableModel model = new DefaultTableModel(rows, columns) { 
     public Class getColumnClass(int column) { 
     Class returnValue; 
     if ((column >= 0) && (column < getColumnCount())) { 
      returnValue = getValueAt(0, column).getClass(); 
     } else { 
      returnValue = Object.class; 
     } 
     return returnValue; 
     } 
    }; 

    JTable table = new JTable(model); 

    RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 

    table.setRowSorter(sorter); 

    JScrollPane pane = new JScrollPane(table); 

    frame.add(pane, BorderLayout.CENTER); 

    frame.setSize(300, 150); 
    frame.setVisible(true); 
    } 
} 

それは二重の値をとるように、私はこのlink少しで指定されたソースを修正しました。

+0

明示的にRowSorterを設定していない場合でもこれは機能しますか?'getColumnClass()'が正しいクラスを返す限り、ソーターを手動で設定する必要はありませんでした。 – AngerClown

+0

明示的に設定しないと、ヘッダをクリックしても何も起こりません。 – AlbertCossi

+0

コードをありがとう! – AlbertCossi

6

このコードは、あなたがこのコードを発行して、あなたのSSCCE demonstateことができますすることができ、コードから何もあなたがあなたの質問から溶液を除去し、答えとして、それを追加する必要があり

import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableTest2 { 

    public void initGUI() { 
     String[] columnNames = {"numbers","double", "text"}; 
     Object[][] data = {{1, 0.81, "A"}, {10, 5.268752005, "B"}, {7, 100.0,"C"},{6, 52.879999, "A"}, 
     {4, 62.50, "B"}, {2, 854.9999, "C"},{11, 19.01, "A"}, {100, 0.0009, "B"}, {20, 100.09, "C"}}; 
     JTable table = new JTable(new DefaultTableModel(data, columnNames) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public java.lang.Class<?> getColumnClass(int c) { 
       return getValueAt(0, c).getClass(); 
      } 
     }); 
     table.setAutoCreateRowSorter(true); 
     table.getRowSorter().setSortKeys(Arrays.asList(new RowSorter.SortKey(0, SortOrder.ASCENDING))); 
     JFrame frame = new JFrame("LFIXimate"); 
     frame.setResizable(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(table)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TableTest2().initGUI(); 
      } 
     }); 
    } 
} 
+0

私は自分のミスを発見する前に両方をテストしたあなたのコードのために多くのおかげで、それはちょうどBragboyが少しきれいに見えたが、本当にありがとう=) – AlbertCossi

+0

@mKorbel +1良い答え。こんにちは。仲良くしてくれてよかった。私は最近、ほとんど活動していません。あまりにも多くの他のもので忙しい:) – Boro

+0

+1の例が短くなって - gooood :-) SortKeysは必要ありません:getRowSorter()。toggleSortOrder(0)は初期ソートを行います – kleopatra

関連する問題