Java TableRowSorter неправильно сортирует строки таблицы - PullRequest
0 голосов
/ 22 октября 2018

Я использую TableRowSorter для сортировки DefaultTableModel в моей JTable.Я использовал код

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)

Таким образом, в основном здесь происходит то, что она неправильно сортирует цену.Даже если сортировка предполагается в порядке возрастания, это не правильно.Как мне исправить это?Если бы у кого-то был ответ, если бы он мог объяснить это, было бы замечательно.

1 Ответ

0 голосов
/ 22 октября 2018

Столбец сортируется в соответствии с классом столбца, который определяется методом getColumnClass модели .

Если вы не переопределяете метод getColumnClass в своей модели, тип каждого столбцаis Object.class, что означает, что его содержимое отсортировано по их строковым формам .

. Вам нужно будет написать класс TableModel, который переопределяет метод 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);
        }
    }
}
...