Сортировка столбца JTable длинных значений

Я пытаюсь отсортировать столбец в своем JTable. Столбец содержит Long (java.util.Long), которые реализуют Comparable. Поэтому, читая этот документ, говорит:

1: Если Comparator был указан для столбца методом setComparator, используйте его.

2: Если класс столбца, возвращенный getColumnClass, является строкой, используйте 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 Long, 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