Номер сортировки в выпуске JTable

Как мне реализовать сортировку столбцов, содержащих. Я установил Cloumnclass это Number.Class

public Class<?> getColumnClass(int columnIndex) {
return Number.class;
}

и создайте TableRowSorter

TableRowSorter sorter= new TableRowSorter<TableModel>(table_mode);
        table.setRowSorter(sorter);

Результат 8, 80, 9, 989 вместо 989 , 80, 9, 8

1 ответ

Решение

Из документации TableRowSorter:

TableRowSorter использования Comparator для сравнения. Следующее определяет, как Comparator выбран для столбца:

  1. Если Comparator был указан для столбца setComparator метод, используйте его.
  2. Если класс столбца, как возвращается getColumnClass является String, использовать Comparator вернулся Collator.getInstance(),
  3. Если класс столбца реализует Comparable используйте компаратор, который вызывает compareTo метод.
  4. Если TableStringConverter было указано, используйте его для преобразования значений в String с, а затем использовать Comparator вернулся Collator.getInstance(),
  5. В противном случае используйте Comparator вернулся Collator.getInstance() по результатам звонка toString на объектах.

Третье и пятое правило являются причиной вашей проблемы: вы возвращаете Number.class, который не реализует Comparable. Поэтому ваша таблица сортируется по пятому правилу: ваши значения обрабатываются как строки.

Вместо того, чтобы возвращать Number.class, вам нужно вернуть что-то, что на самом деле реализует Comparable, например, Integer.class, Double.class или BigDecimal.class. Javadoc каждого класса скажет вам, какие интерфейсы он реализует.

В качестве альтернативы, вы можете установить пользовательский компаратор на столбец таблицы, но ваш компаратор должен будет выполнить приведение значений и, возможно, преобразование их. Возвращать сопоставимый класс намного проще.

Другие вопросы по тегам