Сортиране на JTable колона от longs

Опитвам се да сортирам колона в моята JTable. Колоната съдържа Long's (java.util.Long), които имплементират Comparable. Следователно, четейки този документ, казва:

1: Ако е зададен Comparator за колоната чрез метода setComparator, използвайте го.

2: Ако класът на колоната, върнат от getColumnClass, е String, използвайте Comparator, върнат от Collator.getInstance().

3: Ако класът на колоната имплементира Comparable, използвайте Comparator, който извиква метода compareTo.

4: Ако е зададен TableStringConverter, използвайте го за преобразуване на стойностите в низове и след това използвайте Comparator, върнат от Collator.getInstance().

5: В противен случай използвайте Comparator, върнат от Collator.getInstance() за резултатите от извикване на toString на обектите.

Моят код не създава персонализиран обект Comparator, така че #1 е излязъл. Колоната е колона на Лонг, така че #2 е аут. #3 заявява, че трябва да сортира по метода Long "compareTo". Но не става. Ако моята JTable има 3 дълги, 90,900 и 111, тя ще ги сортира, "900,90,111" или "111,90,900". Изглежда, че ги сортира като низове, както е посочено в #5.

Ето как създаваме нашата таблица:

table = new JTable( new CustomTableModel( new Vector<Vector<Object>>() ,Record.getNames() ) );
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setAutoCreateRowSorter(true);

И след това добавяне на информация:

public void setRecords( Iterable<Record> records ){
    CustomTableModel model = (CustomTableModel) table.getModel();
    model.setRowCount(0);
    model.clearRecords();

    for( Record r : records ){
        Vector<Object> v = new Vector<Object>();
        v.add(r.getFromNumber());
        v.add(r.getToNumber());
        v.add(r.getStartDate());
        v.add(new Long( r.getDuration() ) );
        model.addRow(v);
        model.addRecord(r);
    }
    model.fireTableDataChanged();
    table.getRowSorter().toggleSortOrder(2);

Как мога да го поправя, така че последната колона (колона 3) да е сортирана по Long/long/int, а не по низ? Разгледах персонализирани компаратори, но не бях сигурен как да ги внедря. Не трябва ли JTable да използва #3? Благодаря!


person Ethan Mick    schedule 31.03.2011    source източник


Отговори (1)


Проверете дали методът getColumnClass() на вашия модел връща Long.class.

person trashgod    schedule 31.03.2011
comment
Ааа, връща Object вместо Long. Къде да настроя/променя това? - person Ethan Mick; 31.03.2011
comment
Ето един пример с използване на DefaultTableModel и друг с помощта на AbstractTableModel. - person trashgod; 31.03.2011
comment
Отлично; като погледнем по-отблизо, вторият пример също implements Comparable, за да сортирате по Value. - person trashgod; 31.03.2011