He encontrado bastantes preguntas relacionadas con esto pero no he encontrado una solución simple a mi problema.Ordenando valores dobles en JTable
No encuentro una manera de hacer que mi JTable ordene correctamente los valores dobles.
extendí AbstractTableModel para recibir una serie de clases y devolver los tipos adecuados por columna:
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];
}
...
Y luego, en mi costumbre JTable constructor:
TableRowSorter<TableModelMod> sorter = new TableRowSorter<TableModelMod>((TableModelMod)getModel());
Pero entonces me sale este error al añadir filas:
java.lang.IllegalArgumentException: Cannot format given Object as a Number
se produce un error en el método DecimalFormat.format(Object number, StringBuffer toAppendTo, FieldPosition pos)
que ac cepts la mayoría de los tipos numéricos, pero Doble.
Si utilizo otra clase para las columnas dobles, no obtengo ningún error, pero la ordenación no funciona como se esperaba. He intentado con diferentes clases numéricas pero ninguno parece para ordenar correctamente dobles:
@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];
}
No estoy seguro de si lo que necesito es implementar un RowSorter costumbre, un CellRenderer personalizada, o ambos.
¿Podría alguien guiarme sobre cómo solucionar esto de la manera más simple?
Muchas gracias y saludos cordiales.
EDITADO: RESUELTO
Es bastante embarazoso para decirle dónde estaba el problema.
ArrayList que contiene las filas de Object [] se rellenó de una base de datos ResultSet utilizando getString (int) en lugar de getObject (int) o getDouble (int), por lo tanto el renderizador no pudo usar el valor Double. Es extraño que no haya excepciones usando Número entero o Número como clase de columna, pero de todos modos se ordenó como una Cadena. Estaba buscando un problema en las clases incorrectas ya que estaba convencido de que mi ArrayList solo contenía Objects.
Muchas gracias por sus ejemplos, mirándolos noté que mis dobles eran en realidad Cuerdas y luego pude encontrar dónde estaba ocurriendo la conversión.
Debe eliminar la solución de su pregunta y añadirlo como una respuesta. – murgatroid99