我发现了很多与此相关的问题,但我没有找到解决我问题的简单方法.
我找不到一种方法来使我的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]; } ...
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只包含Objects.
非常感谢你的例子,看着他们我注意到我的双打实际上是字符串然后我可以找到转换发生的地方.
解决方法
看看这段代码.它对双重值进行排序.
import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.RowSorter; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; public class RowSorterDemo { public static void main(String args[]) { JFrame frame = new JFrame("Sort Table Demo"); frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); Object rows[][] = { { "J",23.1 },{ "R",21.1,},{ "E",21.2,{ "B",27.1,{ "A",25.2,{ "S",22.9,}; String columns[] = { "Name","Age" }; TableModel model = new DefaultTableModel(rows,columns) { public Class getColumnClass(int column) { Class returnValue; if ((column >= 0) && (column < getColumnCount())) { returnValue = getValueAt(0,column).getClass(); } else { returnValue = Object.class; } return returnValue; } }; JTable table = new JTable(model); RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); table.setRowSorter(sorter); JScrollPane pane = new JScrollPane(table); frame.add(pane,BorderLayout.CENTER); frame.setSize(300,150); frame.setVisible(true); } }