#java #swing #jtable #defaulttablemodel
#java #качать #jtable #defaulttablemodel
Вопрос:
Я работаю с JTable, которая содержит несколько столбцов с разными типами данных (int, string, date). Когда я запускаю приложение, данные отображаются нормально, но если я использую заголовки столбцов для сортировки данных, они зависают в столбцах, содержащих объекты даты. Ниже приведен код. Проблема возникает из-за столбцов 8, 9 и 10. Как мне сделать так, чтобы столбцы даты можно было сортировать?
public void updateLogTable() {
DefaultTableModel model = (DefaultTableModel) logTable.getModel();
List<LogObject> lstLogObjects = new ArrayList<LogObject>();
lstLogObjects = LogManager.getLog();
for (int i = 0; i < lstLogObjects.size(); i ) {
Object[] temp = new Object[13];
temp[0] = Integer.parseInt(lstLogObjects .get(i).getLogID());
temp[1] = lstLogObjects .get(i).getLogType();
temp[2] = lstLogObjects .get(i).getYear();
temp[3] = lstLogObjects .get(i).getQuarter();
temp[4] = lstLogObjects .get(i).getOriginalID();
temp[5] = lstLogObjects .get(i).getSubject();
temp[6] = lstLogObjects .get(i).getAction();
temp[7] = lstLogObjects .get(i).getRequester();
temp[8] = lstLogObjects .get(i).getADate(); //Returns java.util.Date
temp[9] = lstLogObjects .get(i).getCDate(); //Returns java.util.Date
temp[10] = lstLogObjects .get(i).getSDate(); //Returns java.util.Date
temp[11] = lstLogObjects .get(i).getRemarks();
temp[12] = lstLogObjects .get(i).getField1();
model.addRow(temp);
}
model.fireTableDataChanged();
}
Комментарии:
1. Какой тип
getADate()
возвращает?2. Извините. Я обновил код комментариями. Он вернул java.util.Date
3. @Woodszy что возвращает System.out.println(lstLogObjects .get(i).getADate()); что-то вроде как Пт Янв 10 00:00:00 GTM 2010
Ответ №1:
Вы переопределили метод getColumnClass(…) вашей TableModel, чтобы вернуть правильный класс?
Затем методы сортировки таблицы будут сортировать столбец и обрабатывать его как дату, а не вызывать toString() для объекта Date.
Если вам нужна дополнительная помощь, опубликуйте свой SSCCE, демонстрирующий проблему.
Комментарии:
1. Спасибо. Я использовал сгенерированный Netbeans код для определения JTable, поэтому немного усложнил настройку таблицы. Но ваше предложение сработало.
Ответ №2:
Я бы рекомендовал использовать JXTable для чего-то менее тривиального, чем отображение двух столбцов. Например, здесь приведено базовое введение.
Другой вариант — использовать Long в качестве элемента в таблице и использовать средство визуализации столбцов, которое будет форматировать дату:
temp[8] = lstLogObjects .get(i).getADate().getTime()
table.getColumnModel().getColumn(8).setCellRenderer( new DefaultTableCellRenderer(){
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column){
Object value2 = value;
if(row>0 amp;amp; column==8) //put your own condition here
value2 = new Date((Long)value).toString(); //your own formatting here
return super.getTableCellRendererComponent(table, value2,
isSelected, hasFocus,
row, column);
}
});
}
Комментарии:
1. Не очень эффективно постоянно преобразовывать длинную переменную в дату каждый раз, когда вы хотите отобразить ячейку.