Как мога да сортирам таблица по показана стойност, а не по вътрешна стойност?

Използвам 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. AFAIK таблицата използва 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 Ако посочите Comparator, който преобразува своя аргумент към тип, различен от предоставения от модела, ClassCastException ще бъде хвърлено, когато данните се сортират. Това е част от моя проблем. Моделът очаква тип MJD, но искам да сравня двойни. getColumnClass връща MJD клас и той не може да бъде променен на double по същата причина. - person jkeuhlen; 22.06.2015