{SOLUCIONADO} JTable me repite datos de un ResultSet {SOLUCIONADO}

Iniciado por |Miguel|, 3 Marzo 2012, 16:33 PM

0 Miembros y 1 Visitante están viendo este tema.

|Miguel|

Hola, buenas a todos.

A ver si me podéis echar un cable con esto... vamos a ver, tengo un JTable que quiero llenar con los datos obtenidos de un ResultSet. Hasta ahí todo iba perfecto, pero se me ha ocurrido la genial idea (o no tan genial) de intentar usar un método que me rellene cualquier JTable con cualquier ResultSet... (independientemente de la estructura de la tabla/s que formen el ResultSet)...

Y el resultado es que tengo una Tabla en la Base de Datos con 2 columnas y 3 datos (id y nombre) y lo que he hecho me saca el último dato de la tabla 3 veces.

Aquí os dejo el código de los métodos que uso para llenar el JTable:

Código (java) [Seleccionar]

//**************************************************************************
   static void rellenaJTable(JTable tabla, ResultSet res, String entidad){
       temp = (DefaultTableModel) tabla.getModel(); //Más arriba defino temp asi: static DefaultTableModel temp;
       try{
           res.beforeFirst();
           while(res.next()){                
               Object nuevo[] = rellenaFilaJTable(entidad);
               temp.addRow(nuevo);
           }
       }catch(Exception e){
           excepcion(e, "Error 5. No se ha podido cargar Jtable "+tabla.getName());
       }        
   }
   //**************************************************************************
   static Object[] rellenaFilaJTable(String tabla){
       seleccionaTabla(tabla); //método que carga el ResultSet rs con todos los datos de la tabla que le pase como parámetro
       int longitud = 0;
       try{
           ResultSetMetaData rsmd = rs.getMetaData();
           longitud = rsmd.getColumnCount();
       }catch(Exception e){
           excepcion(e, "Error 6. No se ha podido obtener el número de columnas de '"+tabla+"'.");
       }
       Object[] res = new Object[longitud];
       try{
           while(rs.next()){
               for(int i=1; i<=longitud; i++){
                   try{
                       res[i-1] = rs.getObject(i);
                   }catch(Exception e){
                       excepcion(e, "Error 7. No se han podido rellenar las columnas de '"+tabla+"'; columna "+i+".");
                   }
               }
           }
       }catch(Exception e){excepcion(e);}
       return res;
   }


Gracias!

Proteus1989

Creo que el fallo está en que en rellenaFilaJTable() recorres todo el resultSet y devuelves siempre la ultima fila.

|Miguel|

Sí, por ahí deben ir los tiros... o eso creo. Tengo esto ahora mismo:
Código (java) [Seleccionar]

static void rellenaJTable(JTable tabla, ResultSet res, String entidad){
        temp = (DefaultTableModel) tabla.getModel();
        try{
            res.beforeFirst();
            while(res.next()){
                int pos = rs.getRow();
                Object nuevo[] = rellenaFilaJTable(entidad, pos);
                temp.addRow(nuevo);
            }
        }catch(Exception e){
            excepcion(e, "Error 5. No se ha podido cargar Jtable "+tabla.getName());
        }       
    }
    //**************************************************************************
    static Object[] rellenaFilaJTable(String tabla, int elemento){
        seleccionaTabla(tabla);
        int longitud = 0;
        try{
            ResultSetMetaData rsmd = rs.getMetaData();
            longitud = rsmd.getColumnCount();
        }catch(Exception e){
            excepcion(e, "Error 6. No se ha podido obtener el número de columnas de '"+tabla+"'.");
        }
        Object[] res = new Object[longitud];
        try{
            posiciona(rs, elemento);
            for(int i=1; i<=longitud; i++){
                try{
                    System.out.println(rs.getObject(i));
                    res[i-1] = rs.getObject(i);
                }catch(Exception e){
                    excepcion(e, "Error 7. No se han podido rellenar las columnas de '"+tabla+"'; columna "+i+".");
                }
            }
        }catch(Exception e){excepcion(e);}
        return res;
    }
    //**************************************************************************
    static void posiciona(ResultSet result, int vueltas){
        try{
            for(int i=0; i<=vueltas; i++)
                rs.next();
        }catch(Exception e){
            excepcion(e);
        }
    }


Esto me dibuja el JTable con tres filas, pero rellena solo dos. Es decir, me muestra los datos 2º y 3º, pero se come el primero y me salta la excepción del "Error7", dos veces (una por cada columna)... voy a ver los índices porque supongo que el fallo será ahí.

|Miguel|

SOLUCIÓN:
Código (java) [Seleccionar]

//**************************************************************************
   static void rellenaJTable(JTable tabla, ResultSet res, String entidad){
       temp = (DefaultTableModel) tabla.getModel();
       try{
           while(res.next()){
               int pos = res.getRow();
               Object nuevo[] = rellenaFilaJTable(entidad, pos);
               temp.addRow(nuevo);
           }
       }catch(Exception e){
           excepcion(e, "Error 5. No se ha podido cargar Jtable "+tabla.getName());
       }        
   }
   //**************************************************************************
   static Object[] rellenaFilaJTable(String tabla, int elemento){
       seleccionaTabla(tabla);
       int longitud = 0;
       try{
           ResultSetMetaData rsmd = rs.getMetaData();
           longitud = rsmd.getColumnCount();
       }catch(Exception e){
           excepcion(e, "Error 6. No se ha podido obtener el número de columnas de '"+tabla+"'.");
       }
       Object[] res = new Object[longitud];
       try{
           posiciona(rs, elemento);
           for(int i=1; i<=longitud; i++){
               try{
                   res[i-1] = rs.getObject(i);
               }catch(Exception e){
                   excepcion(e, "Error 7. No se han podido rellenar las columnas de '"+tabla+"'; columna "+i+".");
               }
           }
       }catch(Exception e){excepcion(e);}
       return res;
   }
   //**************************************************************************
   static void posiciona(ResultSet result, int vueltas){
       try{
           for(int i=0; i<vueltas; i++)
               rs.next();
       }catch(Exception e){
           excepcion(e);
       }
   }


Explicaría cuál ha sido mi error y cómo lo he solucionado... pero sinceramente no tengo ni idea. He dado unos cuantos ctrl+Z para arreglar una cosa que había estropeado y ahora funciona bien... XD

Gracias a todos.

Proteus1989

Yo personalmente en vez de devolver un Object[] devolvería un Object[][] y le haría un temp.setData(Object[][])