Foro de elhacker.net

Programación => Java => Mensaje iniciado por: |Miguel| en 3 Marzo 2012, 16:33 pm



Título: {SOLUCIONADO} JTable me repite datos de un ResultSet {SOLUCIONADO}
Publicado por: |Miguel| en 3 Marzo 2012, 16:33 pm
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
  1. //**************************************************************************
  2.    static void rellenaJTable(JTable tabla, ResultSet res, String entidad){
  3.        temp = (DefaultTableModel) tabla.getModel(); //Más arriba defino temp asi: static DefaultTableModel temp;
  4.        try{
  5.            res.beforeFirst();
  6.            while(res.next()){                
  7.                Object nuevo[] = rellenaFilaJTable(entidad);
  8.                temp.addRow(nuevo);
  9.            }
  10.        }catch(Exception e){
  11.            excepcion(e, "Error 5. No se ha podido cargar Jtable "+tabla.getName());
  12.        }        
  13.    }
  14.    //**************************************************************************
  15.    static Object[] rellenaFilaJTable(String tabla){
  16.        seleccionaTabla(tabla); //método que carga el ResultSet rs con todos los datos de la tabla que le pase como parámetro
  17.        int longitud = 0;
  18.        try{
  19.            ResultSetMetaData rsmd = rs.getMetaData();
  20.            longitud = rsmd.getColumnCount();
  21.        }catch(Exception e){
  22.            excepcion(e, "Error 6. No se ha podido obtener el número de columnas de '"+tabla+"'.");
  23.        }
  24.        Object[] res = new Object[longitud];
  25.        try{
  26.            while(rs.next()){
  27.                for(int i=1; i<=longitud; i++){
  28.                    try{
  29.                        res[i-1] = rs.getObject(i);
  30.                    }catch(Exception e){
  31.                        excepcion(e, "Error 7. No se han podido rellenar las columnas de '"+tabla+"'; columna "+i+".");
  32.                    }
  33.                }
  34.            }
  35.        }catch(Exception e){excepcion(e);}
  36.        return res;
  37.    }
  38.  

Gracias!


Título: Re: JTable me repite datos de un ResultSet
Publicado por: Proteus1989 en 3 Marzo 2012, 17:47 pm
Creo que el fallo está en que en rellenaFilaJTable() recorres todo el resultSet y devuelves siempre la ultima fila.


Título: Re: JTable me repite datos de un ResultSet
Publicado por: |Miguel| en 3 Marzo 2012, 17:53 pm
Sí, por ahí deben ir los tiros... o eso creo. Tengo esto ahora mismo:
Código
  1. static void rellenaJTable(JTable tabla, ResultSet res, String entidad){
  2.        temp = (DefaultTableModel) tabla.getModel();
  3.        try{
  4.            res.beforeFirst();
  5.            while(res.next()){
  6.                int pos = rs.getRow();
  7.                Object nuevo[] = rellenaFilaJTable(entidad, pos);
  8.                temp.addRow(nuevo);
  9.            }
  10.        }catch(Exception e){
  11.            excepcion(e, "Error 5. No se ha podido cargar Jtable "+tabla.getName());
  12.        }        
  13.    }
  14.    //**************************************************************************
  15.    static Object[] rellenaFilaJTable(String tabla, int elemento){
  16.        seleccionaTabla(tabla);
  17.        int longitud = 0;
  18.        try{
  19.            ResultSetMetaData rsmd = rs.getMetaData();
  20.            longitud = rsmd.getColumnCount();
  21.        }catch(Exception e){
  22.            excepcion(e, "Error 6. No se ha podido obtener el número de columnas de '"+tabla+"'.");
  23.        }
  24.        Object[] res = new Object[longitud];
  25.        try{
  26.            posiciona(rs, elemento);
  27.            for(int i=1; i<=longitud; i++){
  28.                try{
  29.                    System.out.println(rs.getObject(i));
  30.                    res[i-1] = rs.getObject(i);
  31.                }catch(Exception e){
  32.                    excepcion(e, "Error 7. No se han podido rellenar las columnas de '"+tabla+"'; columna "+i+".");
  33.                }
  34.            }
  35.        }catch(Exception e){excepcion(e);}
  36.        return res;
  37.    }
  38.    //**************************************************************************
  39.    static void posiciona(ResultSet result, int vueltas){
  40.        try{
  41.            for(int i=0; i<=vueltas; i++)
  42.                rs.next();
  43.        }catch(Exception e){
  44.            excepcion(e);
  45.        }
  46.    }
  47.  

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í.


Título: Re: JTable me repite datos de un ResultSet {Solución}
Publicado por: |Miguel| en 3 Marzo 2012, 18:15 pm
SOLUCIÓN:
Código
  1. //**************************************************************************
  2.    static void rellenaJTable(JTable tabla, ResultSet res, String entidad){
  3.        temp = (DefaultTableModel) tabla.getModel();
  4.        try{
  5.            while(res.next()){
  6.                int pos = res.getRow();
  7.                Object nuevo[] = rellenaFilaJTable(entidad, pos);
  8.                temp.addRow(nuevo);
  9.            }
  10.        }catch(Exception e){
  11.            excepcion(e, "Error 5. No se ha podido cargar Jtable "+tabla.getName());
  12.        }        
  13.    }
  14.    //**************************************************************************
  15.    static Object[] rellenaFilaJTable(String tabla, int elemento){
  16.        seleccionaTabla(tabla);
  17.        int longitud = 0;
  18.        try{
  19.            ResultSetMetaData rsmd = rs.getMetaData();
  20.            longitud = rsmd.getColumnCount();
  21.        }catch(Exception e){
  22.            excepcion(e, "Error 6. No se ha podido obtener el número de columnas de '"+tabla+"'.");
  23.        }
  24.        Object[] res = new Object[longitud];
  25.        try{
  26.            posiciona(rs, elemento);
  27.            for(int i=1; i<=longitud; i++){
  28.                try{
  29.                    res[i-1] = rs.getObject(i);
  30.                }catch(Exception e){
  31.                    excepcion(e, "Error 7. No se han podido rellenar las columnas de '"+tabla+"'; columna "+i+".");
  32.                }
  33.            }
  34.        }catch(Exception e){excepcion(e);}
  35.        return res;
  36.    }
  37.    //**************************************************************************
  38.    static void posiciona(ResultSet result, int vueltas){
  39.        try{
  40.            for(int i=0; i<vueltas; i++)
  41.                rs.next();
  42.        }catch(Exception e){
  43.            excepcion(e);
  44.        }
  45.    }
  46.  

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.


Título: Re: {SOLUCIONADO} JTable me repite datos de un ResultSet {SOLUCIONADO}
Publicado por: Proteus1989 en 3 Marzo 2012, 19:26 pm
Yo personalmente en vez de devolver un Object[] devolvería un Object[][] y le haría un temp.setData(Object[][])