2

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

整数值的 JTable 排序问题

JTable + 排序特定字段

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

我写了这个:

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
4

2 回答 2

4

总结一下我的各种评论:

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

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

这是一个演示行为的片段(将其放入您最喜欢的测试设置中,任何框架都可以)。第一列定义为 Integer,它是 Comparable,第二列定义为 Number,它是 Comparable,其他的只是 Object。所有实际值都是整数。第一列按数字排序,所有其他列按其字符串表示

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 (顺便说一句:应该在模型中完成,而不是在视图中完成!)似乎无法在具体上下文中工作,则其他地方存在一些问题应该追查(它迟早会再次出现)

于 2013-06-24T09:24:24.370 回答
0

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

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

于 2013-05-26T02:03:01.003 回答