【问题标题】:Java TableRowSorter not sorting table rows correctlyJava TableRowSorter 未正确排序表行
【发布时间】:2019-03-26 18:30:39
【问题描述】:

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

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

itemsTable.setRowSorter(sorter);

当我单击表格列标题时,它会对其进行排序,但不是很好。假设我有“价格”列,然后单击标题对其进行排序,它对某些行进行了正确排序,但时不时地添加一个不应该存在的行。例如:

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)

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

【问题讨论】:

  • 看起来它是按字母顺序排列的,而不是按数字排列的。您是否尝试过使用数字 Comparator
  • 我建议编辑您的问题标题,以更好地反映如何顺序不正确。

标签: java sorting jtable tablerowsorter


【解决方案1】:

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

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

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

通常,这是通过直接扩展 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);
        }
    }
}

【讨论】:

  • 我对 Java 还是很陌生,所以如果你能写一些代码来做这件事,那就太好了。我所知道的是,要覆盖它,您需要在创建表格格式对象后将一些代码放入 {},但我不知道从那里做什么。
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多