Как отсортировать дату и время в одном столбце в JTable? - PullRequest
0 голосов
/ 30 октября 2019

Я хочу отсортировать что-то вроде LocalDateTime.

В моем JTable у меня есть такие значения:

30.10.2019 09:35:34
12.09.201907:47:55
12.09.2019 22:49:55
24.09.2019 04: 45: 39

Теперь я хочу, чтобы они были отсортированы правильно, как:

12.09.2019 07:47:55
12.09.2019 22:49:55
24.09.2019 04:45:39
30.10.2019 09:35:34

Я пытался настроить TableModel, но это не удалось

@Override
public Class<?> getColumnClass(final int columnIndex)
{
    if (getColumnName(columnIndex).equals("Datecolumn")) return LocalDateTime.class;    
    try
    {
        return getValueAt(0, columnIndex).getClass();
    }
    catch (final Exception e)
    {
        return new String().getClass();
    }

}

Date.class или new Date().getClass() также не работает.

Возможно, у вас есть некоторыеСоветы для меня?

Обновление:

Наконец-то я это сделал, так что вот решение:

table.setAutoCreateRowSorter(true);
          TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
          table.setRowSorter(sorter);
          int columnIndexToSort = table.getColumnModel().getColumnIndex("Datecolumn");
          sorter.setComparator(columnIndexToSort, new Comparator<String>()
          {
             @Override
             public int compare(String o1, String o2)
             {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.uuuu HH:mm:ss");
                LocalDateTime ldt1, ldt2;
                ldt1 = LocalDateTime.parse(o1, formatter);
                ldt2 = LocalDateTime.parse(o2, formatter);
                return ldt1.compareTo(ldt2);
             }
          });

Я знаю, что есть много другихспособы решить эту проблему, но это был первый, который отлично работает для меня.

Это может помочь вам:
https://www.codejava.net/java-se/swing/6-techniques-for-sorting-jtable-you-should-know

Какие-либо улучшения?

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Три шага:

  1. Поместите объекты даты и времени в ваши данные и / или табличную модель, а не строки.
  2. Используйте пользовательский рендерер для форматирования даты и времени в вашемячеек.
  3. Как уже сказал tomgeraghty3, скажите таблице автоматически генерировать сортировщик строк.

Поместите объекты даты-времени в ваши данные

Возможно Instant объекты действительно лучше всего подходят для хранения ваших данных, но вы можете решить, что лучше сами. Чтобы этот пример был простым и только для этой цели, я использую LocalDateTime объекты.

    Object[] columnNames = { "Date and time" };
    Object[][] data = {
            { LocalDateTime.of(2019, Month.OCTOBER, 30, 9, 27) },
            { LocalDateTime.of(2019, Month.SEPTEMBER, 26, 11, 25, 9) },
            { LocalDateTime.of(2019, Month.OCTOBER, 4, 15, 54, 25) },
            { LocalDateTime.of(2019, Month.OCTOBER, 13, 9, 2, 29) }
    };
    table = new JTable(data, columnNames);

Используйте пользовательский рендерер

    table.setDefaultRenderer(Object.class, new MyDateTimeRenderer());

Насколько я понял, это должноМожно было указать LocalDateTime.class для средства визуализации, которое будет использоваться только для LocalDateTime объектов, но это не сработало для меня, я не знаю почему.

Мой класс MyDateTimeRenderer выглядит такthis:

public class MyDateTimeRenderer implements TableCellRenderer {

    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.uuuu HH;mm;ss");

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
        String formattedDateTime = ((LocalDateTime) value).format(formatter);
        Component c = renderer.getTableCellRendererComponent(table,
                formattedDateTime, isSelected, hasFocus, row, column);
        return c;
    }

}

Скажите таблице автоматически генерировать сортировщик строк

    table.setAutoCreateRowSorter(true);

Вы можете поместить этот оператор до или после вызова setDefaultRenderer(). Я считаю более естественным поставить его раньше.

Результат

Теперь перед сортировкой таблица выглядит так:

enter image description here

Нажмите на заголовок столбца «Дата и время» для сортировки. Результат:

enter image description here

Нажмите еще раз для сортировки в обратном порядке по убыванию:

enter image description here

Ссылка

Использование пользовательского рендерера с JTables

0 голосов
/ 30 октября 2019

Убедитесь, что сортировщик строк установлен:

table.setAutoCreateRowSorter(true);
...