Я нашел довольно много вопросов, связанных с этим, но я не нашел простого решения моей проблемы.
Я не могу найти способ правильно настроить значения JTable для сортировки Double.
Я расширил AbstractTableModel, чтобы получить массив Class и возвращать правильные типы для каждого столбца:
class TableModelMod extends AbstractTableModel{
private ArrayList data;
private String [] headers;
private Class [] types;
TableModelMod(String [] heads, ArrayList datas, Class [] classes){
headers = heads;
data = datas;
types = classes;
}
...
@Override public Class getColumnClass(int c){
if (c > types.length - 1)
return null;
else
return types[c];
}
...
А потом в моем конструкторе JTable:
TableRowSorter<TableModelMod> sorter = new TableRowSorter<TableModelMod>((TableModelMod)getModel());
Но тогда я получаю эту ошибку при добавлении строк:
java.lang.IllegalArgumentException: Cannot format given Object as a Number
Сбой при методе DecimalFormat.format(Object number, StringBuffer toAppendTo, FieldPosition pos)
, который принимает большинство числовых типов, кроме Double.
Если я использую другой класс для столбцов Double, я не получаю ошибки, но сортировка все равно не работает должным образом. Я пробовал использовать разные числовые классы, но ни один из них, похоже, не сортирует парные слова правильно:
@Override public Class getColumnClass(int c){
if (c > types.length - 1)
return null;
else if (types[c] == Double.class)
return Number.class;
else
return types[c];
}
Я не уверен, что мне нужно реализовать собственный RowSorter, CellRenderer или оба.
Может ли кто-нибудь подсказать мне, как это исправить проще?
Большое спасибо и наилучшие пожелания.
отредактировано: решено
Довольно неловко говорить, в чем проблема.
ArrayList, содержащий строки Object [], был заполнен из базы данных ResultSet с использованием getString (int) вместо getObject (int) или getDouble (int), поэтому значение не может использоваться как средство визуализации Double. Странно, что он не дает исключений, используя Integer или Number в качестве класса столбца, но в любом случае он сортируется как String. Я искал проблему в неправильных классах, так как был убежден, что мой ArrayList содержит только объекты.
Большое спасибо за ваши примеры, глядя на них, я заметил, что мои двойники на самом деле были Strings, а затем я смог найти, где происходит преобразование.