2012-04-07 7 views
1

私はまだかなりJavaに慣れていて、JTable(特にJXTable)に関する質問があり、データ型が混在した列クラスで行をソートしています...JTable列をStringとして設定し、Doubleとしてソートする方法は?

私はJXTable商品リストのデータを保持するこのテーブルには価格の列があり、String.classに設定したのは、前に '$'を付けて価格を表示できるようにするためだけです。

私がいる問題は行が価格でソートされるとき、それらはダブルスとしてソートされるのではなく、それらは、これらの値ので、文字列としてソートされている。

89.85、179.70、299.40、478.80

は次のようにソートされています

179.70、299.40、478.80、89.85(昇順) と 89.85、478.80、299.40、179.70(降順)

私がやりたい何がで '$' を削除しています列をソートしてソートするときの時間。どうすればこれを達成できますか?

EDIT:

あなたの応答のために非常に多くの智異山Patera、ありがとうございました。 tablecellrendererがこれらのタイプの状況で値を操作する責任があることを理解する助けになる大きな助けとなりました。以下は最終的に私が欲しいものを達成した完成した抜粋です。

ご覧のとおり、私はすでにカスタムtablecellrendererを持っていました。 DecimalFormatを使用して、希望する価格をフォーマットしました。

これは今後誰かを助けてくれることを願っています。

+0

列クラスString型ではなく数値型にします。代わりに、セルレンダラーが "$"記号を示すNumberFormat/currencyインスタンスを使用するようにします。 –

答えて

2

HFOEが正しいです。しかし、これはJava初心者のためには難しいかもしれません。匿名の内部クラスを使用するために私を許してください。いくつかのヒントを得るには、次の例を参照してください。

 

package test; 

import java.awt.Component; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.DefaultTableCellRenderer; 


public class TableTest { 

    public static void main(String[] args) { 
    TableTest tt = new TableTest(); 
    tt.start(); 
    } 

    private void start() { 
    JTable t = new JTable(new AbstractTableModel() { 
     private static final long serialVersionUID = 1L; 
     private List<Double> values = new ArrayList<Double>(); 
     { 
     values.add(Double.valueOf(179.70d)); 
     values.add(Double.valueOf(299.40d)); 
     values.add(Double.valueOf(478.80d)); 
     values.add(Double.valueOf(89.85d)); 
     } 
     @Override 
     public String getColumnName(int column) { 
     return "Double"; 
     } 
     @Override 
     public Class<?> getColumnClass(int column) { 
     return Double.class; 
     } 
     @Override 
     public int getRowCount() { 
     return values.size(); 
     } 
     @Override 
     public int getColumnCount() { 
     return 1; 
     } 
     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
     return values.get(rowIndex); 
     } 
    }); 
    t.setDefaultRenderer(Double.class, new DefaultTableCellRenderer() { 
     private static final long serialVersionUID = 1L; 
     @Override 
     public Component getTableCellRendererComponent(JTable table, 
      Object value, boolean isSelected, boolean hasFocus, int row, 
      int column) { 
     Double d = (Double)value; 
     String s = "$" + String.valueOf(d.doubleValue()); 
     Component c = super.getTableCellRendererComponent(table, s, isSelected, hasFocus, 
      row, column); 
     return c; 
     } 
    }); 
    t.setAutoCreateRowSorter(true); 
    JFrame f = new JFrame(); 
    f.setSize(320, 200); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JScrollPane sp = new JScrollPane(t); 
    f.getContentPane().add(sp); 
    f.setVisible(true); 
    } 

} 
 
+0

+1、しかし.. * "私は匿名の内部クラスを使用するために私を許してください" *ハァッですか?それはデザインの「いいえ」なのでしょうか?多くのSSCCEを書いている人物として、自己完結型コード内のポイントを示すために、しばしば貧しい「設計」の決定を下すことがあります。私は決してそのデザインのために謝罪するとは思わないでしょう! –

+1

@AndrewThompson:迅速な[継続](http://en.wikipedia.org/wiki/Continuation_passing_style#Continuations_as_objects)には完全に受け入れられます。彼らはうまく拡張できません。このエッジケースでショートカットを識別するためにJiriに+1してください。私は、時には[sscce](http://sscce.org/)で_static nested class_を使用して、簡単に再考することができます。 – trashgod

+0

ご意見ありがとうございます。彼らが3行を言うよりも長い時、私はちょうどいい気分にはならない。私は彼らが初心者のために読むのが難しいかもしれないことは分かっているが、私はSSCCEでそれらを使う。 –

関連する問題