【发布时间】:2011-12-15 18:24:35
【问题描述】:
我发现了很多与此相关的问题,但我还没有找到解决问题的简单方法。
我找不到让 JTable 正确排序 Double 值的方法。
我扩展了 AbstractTableModel 以接收一个 Class 数组并为每列返回正确的类型:
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 列使用另一个类,则不会出现错误,但排序仍无法按预期工作。我尝试了不同的数字类,但似乎没有一个能正确排序双精度数:
@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 是使用 getString(int) 而不是 getObject(int) 或 getDouble(int) 从数据库 ResultSet 填充的,因此渲染器无法将该值用作 Double。奇怪的是,它没有使用 Integer 或 Number 作为列类给出异常,但无论如何它都被排序为 String 。我在错误的类中寻找问题,因为我确信我的 ArrayList 只包含对象。
非常感谢您的示例,看着它们我注意到我的双打实际上是字符串,然后我可以找到转换发生的位置。
【问题讨论】:
-
您应该从问题中删除解决方案并将其添加为答案。
标签: java swing jtable double tablerowsorter