首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java TableRowSorter没有正确排序表行

Java TableRowSorter没有正确排序表行
EN

Stack Overflow用户
提问于 2018-10-23 00:03:47
回答 1查看 326关注 0票数 0

我正在使用TableRowSorter对JTable中的DefaultTableModel进行排序。我已经用过代码了

代码语言:javascript
复制
TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(itemTableModel);

itemsTable.setRowSorter(sorter);

当我单击表列标题时,它会对其进行排序,但不是很好。假设我有列"Price",我点击标题对它进行排序,它会正确地对一些行进行排序,但有时会添加不应该在那里的行。例如:

代码语言:javascript
复制
PRICE: (Ascending)

0.59
1.29
25.9
200.99 (not supposed to be here)
32.99
45
8.95 (also not supposed to fit there)

因此,基本上这里发生的情况是,它没有正确地整理价格。即使它应该按升序排序,它也是不正确的。我该如何着手解决这个问题呢?如果任何人有一个答案,如果他们能解释它,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-23 01:29:29

根据列的类对列进行排序,该类由模型的getColumnClass method定义。

如果不覆盖模型中的getColumnClass方法,则每个列的类型都为Object.class,这意味着其内容将按其string forms进行排序。

您需要编写一个覆盖getColumnClass方法的TableModel类。

通常,这是通过直接扩展AbstractTableModel来完成的:

代码语言:javascript
复制
public class ItemModel
extends AbstractTableModel {
    private static final long serialVersionUID = 1;

    private final List<Item> items = new ArrayList<>();

    public void add(Item item) {
        items.add(item);

        int newRow = items.size() - 1;
        fireTableRowsInserted(newRow, newRow);
    }

    @Override
    public int getRowCount() {
        return items.size();
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public Object getValueAt(int row,
                             int column) {

        Item item = items.get(row);

        switch (column) {
            case 0:
                return item.getName();
            case 1:
                return item.getPrice();
            default:
                throw new IllegalArgumentException(
                    "Invalid column: " + column);
        }
    }

    @Override
    public String getColumnName() {
        switch (column) {
            case 0:
                return "Name";
            case 1:
                return "Price";
            default:
                throw new IllegalArgumentException(
                    "Invalid column: " + column);
        }
    }

    @Override
    public Class<?> getColumnClass(int column) {
        switch (column) {
            case 0:
                return String.class;
            case 1:
                // Returning a class which implements/inherits Comprable
                // will cause TableRowSorter to sort
                // by comparing values directly.
                return Double.class;
            default:
                throw new IllegalArgumentException(
                    "Invalid column: " + column);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52933457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档