Problemas en un Jtable con TableRowSorter en campos numericos

2,109 views
Skip to first unread message

Duilio

unread,
Jul 1, 2010, 11:21:28 AM7/1/10
to JavaSOS
Hola estoy cargando un Jtable con datos de una base de datos
postgress mediante hibérnate y quería hacer q se ordenara por la
columna q el usuario quisiera para eso estoy tratando de usar
TableRowSorter

jTable1 = new JTable(modelo);
jTable1.setRowSorter (new
TableRowSorter<DefaultTableModel>(modelo));

Esto funciona perfectamente cuando los campos son strings pero
el problema es que tengo campos numericos ya sean integer o double y
cuando los ordena los ordena mal , los ordena como si fueran strings .
O sea ordena por el primer digito después por el segundo etc por
ejemplo una salida me queda asi (cuando ordeno de mayor a menor):
7
23
24
11
1000
Aguien me puede decir q puede estar pasando.
Muchas gracias desde ya por su ayuda
Saludos
Duilio

David Castañeda

unread,
Jul 1, 2010, 1:06:10 PM7/1/10
to jav...@googlegroups.com
Lo que pasa es que esta tomando los campos como string y no como número, habria que ver como le estas cargando los datos al JTable para poder darte mas información, osea como esta compuesto el modelo y especificamente como el modelo indica el tipo dato contenido en la columna N 

Marcelo Velazquez

unread,
Jul 1, 2010, 1:09:15 PM7/1/10
to jav...@googlegroups.com
No si varia con esto. pero podrias variar con:
 
// Instanciamos modelo de datos, por ejemplo, DefaultTableModel
// y lo metemos en el JTable
DefaultTableModel modelo = new DefaultTableModel();
JTable tabla = new JTable(modelo);

// Instanciamos el TableRowSorter y lo añadimos al JTable
TableRowSorter<TableModel> elQueOrdena = new TableRowSorter<TableModel>(modelo);
tabla.setRowSorter(elQueOrdena);

Si estas con java 6, podrias probar con jTable.setAutoCreateRowSorter(true);
 
dejo link sobre ello:


--
www.JavaSOS.com
Grupo de colaboración Java/J2ee para desarrolladores de habla hispana.

Duilio Bacalor

unread,
Jul 1, 2010, 1:19:55 PM7/1/10
to jav...@googlegroups.com
Hola desde ya gracias por tu tiempo mira el modelo lo creo asi

private DefaultTableModel modelo = new DefaultTableModel(){
public boolean isCellEditable(int row, int column){
return false;
}
};

despues asigno el modelo al jtable asi


private JTable getJTable1() {
if (jTable1 == null) {
jTable1 = new JTable(modelo);
jTable1.setRowSorter (new TableRowSorter<DefaultTableModel>(modelo));
jTable1.setBackground(Color.white);
jTable1.setSelectionBackground(new Color(250, 201, 104));



y por ultimo la tabla se carga a partir de una session de hibernate con una sentencia sql y de esta manera:

Object[] titulo = new Object[19];  //Son 19 columnas
// Creamos los titulos.
titulo[0] = "Producto";
titulo[1] = "Marca";
titulo[2] = "Modelo";
titulo[3] = "Categoría";
titulo[4] = "Origen";
titulo[5] = "Originalidad";
titulo[6] = "Tamaño";
titulo[7] = "Medida";
titulo[8] = "Codigo Artículo";
titulo[9] = "Precio Venta";
titulo[10] = "Color";
titulo[11] = "Id Item";
titulo[12] = "Material";
titulo[13] = "Presentación";
titulo[14] = "Iva";
titulo[15] = "Stock Mínimo"; 
titulo[16] = "Ganancia";
titulo[17] = "Forma Calculo";
titulo[18] = "Precio Costo";
modelo.setColumnIdentifiers(titulo);  //Pone los titulos
Session session = SessionFactoryUtil.getSessionFactory().openSession();  //getCurrentSession();      
   session.beginTransaction(); 

   java.util.List lista = session.createSQLQuery("SELECT * FROM producto.item ORDER BY descripcion").addEntity(Item.class).list();
   Iterator iter = lista.iterator();

   while (iter.hasNext()){
    Object [] fila = new Object[19]; // Hay 19 columnas en la tabla
   
    Item item = new Item();
       item = (Item) iter.next();
       if (item.isBaja() == false){
   
        // Se rellena cada posición del array con una de las columnas de la tabla en base de datos.
   
        // IdItem
        fila[11] = item.getIdItem();
       
        //Presentacion
        Presentacion presentacion = new Presentacion();
        Set presentaciones = new HashSet();
         presentaciones = item.getPresentaciones();
         Iterator iter2 = presentaciones.iterator();
         while (iter2.hasNext()){
         presentacion = (Presentacion)iter2.next();
         }
        if (presentacion.getDescripcion()==null){
        fila[13] = " ";
        }
        else{
        fila[13] = presentacion.getDescripcion();
        }
       
        //Iva
        if (item.getIva()==null){
        fila[14] = " ";
        doIva = 0; 
        }
        else{
        fila[14] = item.getIva().getCantidad();
        doIva = item.getIva().getCantidad();
        }
       
        //Nombre del Producto
        fila[0] = item.getDescripcion();
       
           //Precio  Costo   ///Ver tema nulos
        fila[18] = item.getCostUnit();
        doPrecioCosto = item.getCostUnit();        
       
        //Categoria
        if (item.getCategoria()==null){
        fila[3] = " ";
        }
        else{
        fila[3] = item.getCategoria().getDescripcion();
        }        
       
        //Modelo
        if (item.getModeloItem()==null){
        fila[2] = " ";
        }
        else{
        fila[2] = item.getModeloItem().getDescripcion();
        }
       
        //Marca
        if (item.getMarcaItem()==null){
        fila[1] = " ";
        }
        else{
        fila[1] = item.getMarcaItem().getDescripcion();
        }
       
        //Origen
        if (item.getOrigen()==null){
        fila[4] = " ";
        }
        else{
        fila[4] = item.getOrigen().getDescripcion();
        }
       
        //Originalidad
        if (item.getOriginalidad()==null){
        fila[5] = " ";
        }
        else{
        fila[5] = item.getOriginalidad().getDescripcion();
        }
       
        //Color
        if (item.getColorItem()==null){
        fila[10] = " ";
        }
        else{
        fila[10] = item.getColorItem().getDescripcion();
        }
       
        //Tamaño
        if (item.getTamano()==null){
        fila[6] = " ";
        }
        else{
        fila[6] = item.getTamano().getDescripcion();
        }
       
        //Material
        if (item.getMaterial()==null){
        fila[12] = " ";
        }
        else{
        fila[12] = item.getMaterial().getDescripcion();
        }
       
        //CodigoArticulo
        if (item.getCodigoArticulo()==null){
        fila[8] = " ";
        }
        else{
        fila[8] = item.getCodigoArticulo();
        }
       
        //Medida
        if (item.getMedida()==null){
        fila[7] = " ";
        }
        else{
        fila[7] = item.getMedida();
        }
        //StockMinimo                  /////Controlar los valores nulos de la BBDD
         DecimalFormat StockDecimal = new DecimalFormat("0");
         fila[15] = StockDecimal.format(item.getStockMinimo());
        
        //Ganancia y forma de calculo de ganancia
        Ganancia ganancia = new Ganancia();
        Set ganancias = new HashSet();
        ganancias = item.getGanancias();
         Iterator iter3 = ganancias.iterator();
        
         while (iter3.hasNext()){
         ganancia = (Ganancia)iter3.next();
         }
        if (ganancia.getCantidad()==0){   ///Ver el tema de nulos
        fila[16] = 0;
        doGanancia = 0;
        if (ganancia.getFormaCalculoGanancia()==null){
        fila[17] = " ";
        sFormaCalculoGanancia = " ";
        }
        else{
        fila[17] = ganancia.getFormaCalculoGanancia().getDescripcion();
        sFormaCalculoGanancia = ganancia.getFormaCalculoGanancia().getDescripcion();
        }
       
        }
        else{
        fila[16] = ganancia.getCantidad();
        doGanancia = ganancia.getCantidad();
        if (ganancia.getFormaCalculoGanancia()==null){
        fila[17] = " ";
        sFormaCalculoGanancia = " ";
        }
        else{
        fila[17] = ganancia.getFormaCalculoGanancia().getDescripcion();
        sFormaCalculoGanancia = ganancia.getFormaCalculoGanancia().getDescripcion();
        }
        }
       
        doPrecioVenta = CalculaPrecioVenta(doPrecioCosto, doIva, doGanancia, sFormaCalculoGanancia);
       
         DecimalFormat PrecioVentaDecimal = new DecimalFormat("0.00");
        fila[9] = PrecioVentaDecimal.format(doPrecioVenta);
       
   // Se añade al modelo la fila completa.
        modelo.addRow(fila);
       }
   }
   session.close(); 


El 1 de julio de 2010 14:06, David Castañeda <davi...@gmail.com> escribió:
Lo que pasa es que esta tomando los campos como string y no como número, habria que ver como le estas cargando los datos al JTable para poder darte mas información, osea como esta compuesto el modelo y especificamente como el modelo indica el tipo dato contenido en la columna N 

David Castañeda

unread,
Jul 1, 2010, 3:11:30 PM7/1/10
to jav...@googlegroups.com
Dale una leida a esto: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

despues de eso si aun tienes dudas vuelves y escribes, pero en general son dos cosas.
El modelo puede contener la lista directamente que obtienes de la base de datos y no trabajas con un DefaultTableModel.

Si decides trabajar con el defaultTableModel (q no creo sea la mejor opción) puedes sobreescribir el método getColumnClass(int) y ahi indicas el tipo de dato contenido para dicha columna.

Como comentario a tu codigo crea un metodo que reciba el valor que vas a asignar y ese metodo verifica si es null, y si es null entonces retorna el string vacio o de lo contrario retorna el valor a asignar. (esto es solo comentario, eso no te soluciona el otro problema).

Segun entiendo la forma facil de solucionarlo es la que dice Marcelo Velazquez

Duilio Bacalor

unread,
Jul 1, 2010, 3:30:16 PM7/1/10
to jav...@googlegroups.com
Gracias David voy a seguir probnado porque lo que me decia marcelo vazquez (jTable.setAutoCreateRowSorter(true);) ya lo probe y me hace lo mismo . gracias por tu tiempo 
saludos
Duilio

--

David Castañeda

unread,
Jul 1, 2010, 5:03:33 PM7/1/10
to jav...@googlegroups.com
Te resumo el problema>... lo que ocurre es que lo que esta encargado de hacer el sorting debe estar obteniendo un string, entonces debes asegurarte que lo que se esta pasando es un tipo de dsato num[erico y que el tableModel efectivamente dice que el dato en esa columna es un numero y no un string.
Reply all
Reply to author
Forward
0 new messages