2014-09-30 2 views
0

Извините, что задал основной вопрос еще раз. Как новый для java, поэтому я подумал, что лучше взять руководство, а не делать что-то глупое.Java Jtable coulmn shorting with date не работает должным образом

В моей 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(); 
    } 

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

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

Если я нажимаю колонку на короткую дату, она дает мне ошибку.

Что я делаю неправильно и что это правильный способ сделать это.

Благодаря

+0

Что значение, которое возвращает этот столбец, есть Date.class взамен, иначе этот вопрос не делает меня Sence – mKorbel

+1

для получения дополнительной информации, чтобы читать Oracle учебник Как использовать таблицы - часть о рендерах (описание данных типы) – mKorbel

+0

Привет @mKorbel Я добавил некоторые подробности о классе модели, чтобы сделать его более читаемым. – javadotnetcoder

ответ

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.

+0

Спасибо, его решить вопрос – javadotnetcoder

+0

Привет @ dic19, он решает проблему, но я не получил table.setDefaultRenderer (Date.class, new DefaultTableCellRenderer), в этом почему мы упоминали Date.class, почему мы использовали его здесь – javadotnetcoder

+1

@ javadotnetcoder: да, 'JTable' использует [* Class Literals как токены типа Runtime *] (http://docs.oracle.com/javase/tutorial/extra/generics/literals.html), чтобы связать тип данных с пользовательским визуализатор. – trashgod

2

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

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

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

  • Принудительно использовать формат даты с использованием пользовательского renderer и подходящего DateFormat, т.е. "MMMM/yyyy", как показано на рисунке here.

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

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