我发现了很多与此相关的问题,但我还没有找到解决我的问题的简单方法。在JTable中对双精度值进行排序
我无法找到一种方法使我的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)
失败ac大多数数字类型除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作为列类来提供异常,但是它正在被排序为一个字符串。我在错误的类中寻找一个问题,因为我确信我的ArrayList只包含对象。
非常感谢你的例子,看着他们我发现我的双打实际上是弦乐,然后我可以找到转换发生的地方。
你应该从你的问题中删除解决方案,并将其添加作为一个答案。 – murgatroid99