私はまだJavaにかなり慣れていないので、JTable(より具体的にはJXTable)と、混合データ型の列クラスで行を並べ替えることに関して質問があります...詳しく説明します...
商品リストのデータを保持するJXTableがあります。このテーブルには、「$」を前に付けて価格を表示できるように、String.classにのみ設定した価格の列があります。
私が抱えている問題は、行が価格で並べ替えられている場合、Doubleとして並べ替えられるのではなく、文字列として並べ替えられるため、次の値になります。
89.85、179.70、299.40、478.80
次のように並べ替えられます:
179.70、299.40、478.80、89.85(昇順)および89.85、478.80、299.40、179.70(降順)
私がやりたいのは、ソート時に「$」を削除し、列をDoubleとしてソートすることです。どうすればこれを達成できますか?
編集:
ご回答ありがとうございます。テーブルセルレンダラーがこれらのタイプの状況で値を操作する責任があることを理解するのに大いに役立ちました。以下は、私が望むことを最終的に達成した完成した抜粋です。
public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected, boolean pHasFocus, int pRow, int pColumn) {
// Use the wrapped renderer
Component renderedComponent = mWrappedRenderer.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus, pRow, pColumn);
Component renderedComponentHeader = pTable.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus, pRow, pColumn);
if (pColumn == 4 && pValue instanceof Double){
DecimalFormat df = new DecimalFormat("$###,##0.00");
Double d = (Double) pValue;
String s = df.format(d);
renderedComponent = mWrappedRenderer.getTableCellRendererComponent(pTable, s, pIsSelected, pHasFocus, pRow, pColumn);
}
// Set the alignment
Integer alignment = mSpecialColumnAlignmentMap.get(pColumn);
Integer width = mSpecialColumnWidthMap.get(pColumn);
if (alignment != null) {
((JLabel) renderedComponent).setHorizontalAlignment(alignment);
((JLabel) renderedComponentHeader).setHorizontalAlignment(alignment);
} else {
((JLabel) renderedComponent).setHorizontalAlignment(mDefaultAlignment);
((JLabel) renderedComponentHeader).setHorizontalAlignment(mDefaultAlignment);
}
if (width != null){
pTable.getColumnModel().getColumn(pColumn).setPreferredWidth(width);
pTable.getColumnModel().getColumn(pColumn).setMaxWidth(width);
}
return renderedComponent;
}
ご覧のとおり、私はすでにカスタムテーブルセルレンダラーを持っていました。DecimalFormatを使用して、希望どおりに価格をフォーマットしました。
これが将来誰か他の人を助けることを願っています。