私はこれに関連するかなりの数の質問を見つけましたが、私の問題に対する簡単な解決策は見つかりませんでした。
JTableでDouble値を正しくソートする方法が見つかりません。
AbstractTableModelを拡張して、クラス配列を受け取り、列ごとに適切な型を返しました。
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];
}
...
そして、私のカスタムJTableコンストラクターで:
TableRowSorter<TableModelMod> sorter = new TableRowSorter<TableModelMod>((TableModelMod)getModel());
しかし、行を追加すると次のエラーが発生します。
java.lang.IllegalArgumentException: Cannot format given Object as a Number
DecimalFormat.format(Object number, StringBuffer toAppendTo, FieldPosition pos)
Double以外のほとんどの数値タイプを受け入れるメソッドでは失敗します。
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、またはその両方を実装する必要があるかどうかはわかりません。
誰かがこれをもっと簡単な方法で修正する方法を教えてもらえますか?
どうもありがとうございました。
編集済み:解決済み
問題がどこにあったかを知るのは非常に恥ずかしいことです。
Object []行を含むArrayListは、getObject(int)またはgetDouble(int)の代わりにgetString(int)を使用してデータベースResultSetから入力されたため、レンダラーは値をDoubleとして使用できませんでした。列クラスとして整数または数値を使用して例外が発生しなかったのは奇妙ですが、とにかく文字列としてソートされていました。ArrayListにはオブジェクトだけが含まれていると確信していたので、間違ったクラスで問題を探していました。
あなたの例をどうもありがとう、それらを見て、私は私のダブルスが実際には文字列であることに気づきました、そしてそれから私は変換が起こっていた場所を見つけることができました。