JTable无法正确排序Integers和Double值

时间:2013-05-26 01:44:28

标签: java swing jtable

我已经阅读了几个关于JTable排序的问题:

Problems with JTable sorting of integer values

JTable + Sorting specific field

但由于某种原因,我仍然无法做到正确。

我写了这个:

String allItemsColumns [] = { "#", "Name", "Stock", 
    "Price", "Type", "Supplier", "Location", "" };
allItemsTableModel = new DefaultTableModel(null, allItemsColumns);
allItemsTable = new JTable(allItemsTableModel)
{       
    Class<?>[] types = { Integer.class, String.class, Integer.class, 
         Double.class, String.class, String.class, String.class, ImageIcon.class };

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return this.types[columnIndex];
    }
};

但我还是得到了

0
10000
20

当我对股票进行分类时可能这是显而易见的,但我现在真的很想念它。

我不认为我是如何添加信息的,因为我(想的是)告诉它将列读作整数,双打或字符串

我的排序方法:

allItemsTable.setAutoCreateRowSorter(true);
TableRowSorter<DefaultTableModel> rowSorter = 
     (TableRowSorter<DefaultTableModel>)allItemsTable.getRowSorter();
rowSorter.setComparator(3, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2)
    {
        return Integer.parseInt(o1) - Integer.parseInt(o2);
    }

});

我从我看到的一个问题中得到了它。第3列是“Stock”,它只是整数,但结果,就像我说的那样:

0
10000
20

2 个答案:

答案 0 :(得分:4)

总结我的各种评论:

  • TableRowSorter可以并且确实按预期对可比较类型进行排序
  • getColumnClass是为分拣机提供正确排序方法的关键,因为它确定使用哪个默认比较器
    • 如果 return 类型是Comparable,则它是委托给它的比较器实现
    • 如果 return 类型不是Comparable,则使用Collat​​or实例并使用值的字符串表示形式,无论它的实际类型是否为Comparable < / LI>

因此,不需要在包含可相互比较的值的列中使用自定义比较器,只需实现columnClass即可返回该类型并完成。

这是一个演示行为的片段(把它扔进你最喜欢的测试设置,只是任何帧都可以)。第一列定义为Integer,它是一个可比较的,第二列是一个数字,它是一个可比较的,其他的只是对象。所有实际值都是整数。第一列按数字排序,所有其他列按字符串表示

final Class[] classes = new Class[]{Integer.class, Number.class};
DefaultTableModel model = new DefaultTableModel(0, 3) {

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if (columnIndex < classes.length) 
            return classes[columnIndex];
        return super.getColumnClass(columnIndex);
    }

    @Override
    public String getColumnName(int column) {
        return getColumnClass(column).getSimpleName();
    }

};
for (int row = 0; row < 15; row++) {
    model.addRow(new Object[]{row, row, row});
}
JTable table = new JTable(model);
table.setAutoCreateRowSorter(true);

如果实现columnClass(顺便说一句:应该在模型中完成,而不是视图!)似乎不能在具体的上下文中工作,那么其他地方应该有一些问题需要跟踪(它迟早会再次出现) )

答案 1 :(得分:0)

据我所知,getColumnClass()对排序没有影响。它用于确定编辑。

如果您要添加数字的字符串表示并希望它们按数字排序,那么这就是您的问题。将它们添加为数字类型,它应该工作。排序基于实现TableModel接口的Comparable中的值。