Как я могу отсортировать таблицу по отображаемому значению, а не по внутреннему значению?

Я использую ETable для немного дополнительных функций по сравнению со стандартным JTable.

Проблема, с которой я сталкиваюсь, заключается в правильной сортировке таблицы при нажатии заголовков столбцов. В настоящее время у меня есть поле даты, отображающее измененную юлианскую дату (MJD) в необработанном (двойном) формате. Внутри это объект MJD (который выглядит как строка даты). Когда таблица отсортирована, столбец обрабатывается по умолчанию (лексикографическая сортировка) и, таким образом, дает список, подобный 1.0, 10.0, 100.0, 101.0, .... Если я показываю объект MJD, а не двойную форму, он сортируется правильно; однако мне нужно отобразить его как двойной. Как заставить сравнения и сортировку выполняться на основе того, что отображается?

Обратите внимание, что я рассмотрел несколько похожих вопросов, размещенных здесь, например Сортировка Java JTable не работает только для одного столбца. Этот тип решения не работает для меня, так как я не могу просто вернуть двойной класс для столбца, поскольку внутри это другой тип объекта.


person jkeuhlen    schedule 22.06.2015    source источник
comment
Большинство этих структур должны позволять вам предоставлять свои собственные Comparator, и, таким образом, вы можете сами определять, как эти строки сравниваются, т.е. преобразовывать их в двойные, а затем преобразовывать и т. д.   -  person Thomas    schedule 22.06.2015
comment
@Thomas Я новичок в java, и я видел примеры Comparator, но я не совсем уверен, куда его поместить? Класс MJD уже переопределяет compareTo, чтобы мы могли сравнивать фактические объекты MJD.   -  person jkeuhlen    schedule 22.06.2015
comment
Ну, в этом случае ваш тип данных столбца должен быть MJD. Насколько мне известно, в таблице используется RowSorter (устанавливается через table.setRowSorter(...)), и по умолчанию будет экземпляр TableRowSorter, который должен правильно работать с классифицированной реализацией Comparable. Кроме того, вы также можете попробовать получить RowSorter и позвонить setComparator(index, comparator).   -  person Thomas    schedule 22.06.2015


Ответы (1)


Как показано в JTable учебнике, вы можете установить TableRowSorter на вашей таблице или в этом конкретном столбце. DefaultRowSorter#setComparator интересен в вашем случае: вы можете повторно использовать сортировщик строк по умолчанию для всех ваших столбцов и просто указать пользовательский Comparator для этого конкретного столбца.

Конечно, если ваши объекты в табличной модели уже реализуют Comparable, нет необходимости задавать собственный Comparator. Просто убедитесь, что TableModel#getColumnClass возвращает правильный класс.

person Robin    schedule 22.06.2015
comment
Из DefaultRowSorter. Если вы укажете компаратор, который приводит свой аргумент к типу, отличному от предоставленного моделью, при сортировке данных будет выброшено исключение ClassCastException. Это часть моей проблемы. Модель ожидает тип MJD, но я хочу сравнить двойники. getColumnClass возвращает класс MJD, который нельзя изменить на double по той же причине. - person jkeuhlen; 22.06.2015