Сокращение столбца Java Jtable с датой не работает должным образом

Извините, что снова задаю основной вопрос. Как новичок в java, поэтому я подумал, что лучше взять руководство, чем делать что-то глупое.

В моем jtable у меня есть следующие данные

Id | Name | Date(month-year)
1  | XYZ  | August-2014
2  | ABc  | April-2014

мой Modelclass выглядит следующим образом

class MyTableModel extends AbstractTableModel {

 private String[] columnNames = {"Id", "Country","Date"};

 public final Object[] longValues = {Integer.class,"",Date.class};

теперь, как и было рекомендовано, я переопределил getColumnClass в моей таблице моделей

@Override
 public Class getColumnClass(int c)
 {
     if(c == 2)
     {
              //return Date.class;
              return getValueAt(0,c).getClass();
     }
      else
         return getValueAt(0,c).getClass();
  }

и я включил сортировщик столбцов по умолчанию.

Теперь по умолчанию все строковые столбцы отлично работают при сокращении, но столбец Date также рассматривается как строка и сокращается как строка.

Если я заставлю столбец сократиться до даты, это даст мне ошибку.

Что я делаю не так и как правильно поступить.

Спасибо


person javadotnetcoder    schedule 30.09.2014    source источник
comment
какое значение возвращает этот столбец, есть ли взамен Date.class, иначе этот вопрос не имеет смысла   -  person mKorbel    schedule 30.09.2014
comment
для получения дополнительной информации прочитайте учебник по Oracle. Как использовать таблицы - часть о средствах визуализации (описание типов данных)   -  person mKorbel    schedule 30.09.2014
comment
Привет @mKorbel, я добавил некоторые подробности о классе модели, чтобы сделать его более читабельным.   -  person javadotnetcoder    schedule 30.09.2014
comment
Вы могли бы избавиться от всего if/else, глядя на эти идентичные утверждения! Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный полный проверяемый пример).   -  person Andrew Thompson    schedule 30.09.2014


Ответы (2)


Теперь, как и было рекомендовано, я переопределил getColumnClass в таблице моделей

Обратите внимание, что ваша реализация неверна, главным образом потому, что вам никогда не нужно запрашивать значение модели, чтобы получить класс столбца (не говоря уже о избыточном/бесполезном блоке if-else). Поскольку вы знаете свою модель, вы вполне можете вернуть правильный класс столбца без необходимости запрашивать модель:

@Override
public Class<?> getColumnClass(int columnIndex) {
    switch (columnIndex) {
        case 0: return Integer.class; // Id column
        case 1: return String.class; // Name column
        case 2: return Date.class; // Date column
            default: return super.getColumnClass(columnIndex);
    }
}

Этого должно быть достаточно, чтобы правильно отсортировать столбец дат, даже если ваш рендерер показывает шаблон месяца-года:

table.setDefaultRenderer(Date.class, new DefaultTableCellRenderer() {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

        if (value instanceof Date) {
            SimpleDateFormat formatter = new SimpleDateFormat("MMMM-yyyy");
            value = formatter.format((Date)value);
        }

        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
});

Например, если у вас есть 9/27/2014 и 9/30/2014, то это должен быть естественный порядок возрастания при сортировке этого столбца, независимо от того, в обеих ячейках отображается September-2014.

person dic19    schedule 30.09.2014
comment
Привет @dic19, это решило проблему, но я не получил table.setDefaultRenderer(Date.class, new DefaultTableCellRenderer), почему мы упомянули Date.class, почему мы использовали его здесь - person javadotnetcoder; 30.09.2014
comment
@javadotnetcoder: да, JTable использует литералы классов в качестве типа времени выполнения Токены для связывания типа данных с пользовательским средством визуализации. - person trashgod; 30.09.2014

Несколько вещей должны работать согласованно:

  • Пусть второй столбец, помеченный Date, возвращает Date.class из getColumnClass().

  • Убедитесь, что в файл TableModel добавляются только значения типа Date.class.

  • Обеспечьте соблюдение формата даты с помощью пользовательского рендерера и подходящего DateFormat , например "MMMM/yyyy", как показано здесь.

  • Примите соглашение относительно дат с точностью до месяца, например. первый день месяца и примените его в общедоступном интерфейсе вашей модели.

person trashgod    schedule 30.09.2014