2013-06-24 2 views
3

Я хотел бы отсортировать Jtable по дате в одной колонке, но показывать только дату в формате dd-MM-yyyy. Таким образом, все записи одинаковы и отличаются только секундами, которые не видны.Swing JTable сортировать по дате

У меня есть TableModel, который получает данные со следующим методом:

@Override 
public Object getValueAt(int row, int col) { 

    Object[][] tableData = new Object[rowDataMap.keySet().size()][1]; 
    int index = 0; 
    for (Long key : pane.nqm_messages.keySet()) 
    { 
     Date date = rowDataMap.get(key); 

     SimpleDateFormat form = new SimpleDateFormat("dd-MM-yyyy"); 
     String outputDate = form.format(date); 

     tableData[index][0] = outputDate; 

     index++; 
    } 
    return tableData[row][col]; 
} 

А вот мой TableRowSorter, где я хочу, чтобы отсортировать строки:

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 
List<SortKey> keys = new ArrayList<SortKey>(); 

SortKey sortKey; 
sorter.setComparator(0, new Comparator<String>() { 
    @Override 
    public int compare(String s1, String s2) { 
     //Sort dd-MM-yyyy 
    } 
}); 

Если я это так Я не могу его сортировать, потому что строки являются obv. все так же. Когда я непосредственно использовать объект даты, как, что

tableData [индекс] [0] = дату

Я не знаю, как отобразить его в правильном формате, но сортировка может быть сделана.

Как я могу достичь обоих?

+0

не возвращают строковое представление значения, возвращают значение себя и реализовать columnClass соответственно – kleopatra

+0

Помимо того, что Kleopatra указал, что является крайне неэффективным чтобы попытаться построить данные отображения по каждому запросу ячейки – MadProgrammer

+0

, кроме этого, реализация вашей модели выглядит подозрительной: а) почему создать полный массив 2d, когда вам просто нужно вернуть одно значение? б) зачем создавать одно значение для каждого вызова getValueAt? Если это так динамично, что он может меняться между вызовами, модель, скорее всего, ошибочно, не уведомляя своих слушателей по мере необходимости. C) Форматирование даты является ответственностью рендерера (не модели) – kleopatra

ответ

4

Не конвертируйте Date объектов в String. Вместо этого используйте их непосредственно в модели. На модели не обязательно предлагать форматирование, вместо этого используйте TableCellRenderer.

Разрешить getValueAt вернуть объект Date.

Измените модель таблицы и переопределите метод getColumnClass и верните класс соответствия для столбцов hiven (например, Date.class).

Таблица, по умолчанию, отформатирует объекты Date.

Вы можете поставить свой собственный TableCellRenderer, если по умолчанию это не по вашему вкусу.

См How to use tables для получения более подробной информации, обратите особое внимание на Using Custom Renderers

3

Всякий раз, когда логика display и inner отличается вам следует рассмотреть TableModel и CellRenderer. Почему вы не добавляете CellRenderer в столбец даты? Средство отображения ячеек отображает объект даты с помощью SimpleDateFormat, однако внутренние значения остаются как объекты Date. Таким образом, сортировка должна работать правильно, потому что сортировщик работает с внутренними значениями.

+0

Если 'TableModel # getColumnClassAt' возвратил' Data.class', таблица использовала бы свой собственный рендеринг ячеек таблицы по умолчанию.Однако +1 для предложения использования «CellRenderer» не менее – MadProgrammer

+0

Я думаю, что CellRenderer переопределяет все используемые по умолчанию средства визуализации с помощью метода getColumnClassAt. но я могу ошибаться –

+0

Да, это моя точка зрения, но при необходимости вы можете предоставить свои собственные. – MadProgrammer

Смежные вопросы