Java TableRowSorter 未正确排序 table 行

Java TableRowSorter not sorting table rows correctly

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

TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(itemTableModel);

itemsTable.setRowSorter(sorter);

当我单击 table 列时 headers 它确实对它进行了排序,但不是很好。假设我有 "Price" 列,我单击 header 对其进行排序,它对一些行进行了正确排序,但时不时地添加了一个不应该存在的行。例如:

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)

所以基本上这里发生的事情是它没有正确地整理价格。尽管它应该按升序排序,但它是不正确的。 我将如何解决这个问题?如果有人能给出答案并解释一下,那就太好了。

一列按照列的class排序,由模型的getColumnClass method定义。

如果您不重写模型中的 getColumnClass 方法,则每一列的类型都是 Object.class,这意味着其内容按 string forms.

排序

您需要编写一个 TableModel class 来覆盖 getColumnClass 方法。

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

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);
        }
    }
}