Foros del Web » Programación para mayores de 30 ;) » Java »

Dolor de cabeza con JTable y Resultset

Estas en el tema de Dolor de cabeza con JTable y Resultset en el foro de Java en Foros del Web. Hola, tengo un JTable (netbeans) en el que quiero mostrar los resultados de dos columnas de una tabla mysql en internet. (nick, y estado) La ...
  #1 (permalink)  
Antiguo 24/02/2012, 16:24
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 1 mes
Puntos: 0
Pregunta Dolor de cabeza con JTable y Resultset

Hola, tengo un JTable (netbeans) en el que quiero mostrar los resultados de dos columnas de una tabla mysql en internet. (nick, y estado)
La conexion con tabla esta toda bien, y el programa obtiene toda la informacion y la deja en un resulset, pero se me hace imposible mostrarla en el jTable. ya lo e intentado de muchas maneras:


Código:
while(bd.resultado.next()){
int x = 0;
tabla.setValueAt(bd.resultado.getObject("nick"),x,0);
tabla.setValueAt(bd.resultado.getObject("estado"),x,1);
x++;
}
De esta forma, me introduce los datos si el numero de filas de la tabla, es menor que el numero de filas a insertar, y me da un out of bounds exception 16>=16 (16 elra el numero de filas de la tabla), claro dije, pues voi a ponerle cien filas a la tabla, pero si la tabla tiene mas filas que las filas a insertar, se queda procesando indefinidamente y tengo que terminarlo mediante el administrador de tareas

Tambien lo probe modificando el table model:


Código:
 public static void recogertodoslosdatos(){
        bd.ConectarBaseDeDatos();
       
        
        
        try{
            DefaultTableModel temp = (DefaultTableModel) Inicio.tabla.getModel();
            bd.resultado = bd.sentencia.executeQuery("SELECT * FROM whitelist");
            while(bd.resultado!=null){
                while(bd.resultado.next()){
                    
                     Object [] fila = {bd.resultado.getObject("nick"),bd.resultado.getObject("estado")};
                  
                  
                    temp.addRow(fila);
                    
            
                }
            }
        }catch(Exception e){JOptionPane.showMessageDialog(null,e);
            
        }
    }
pero me pasa absolutamente lo mismo, se queda procesando indefinidamente y no acaba nunca, por lo que tengo que terminarlo mediante el administrador de tareas. he provado metodos parecidos entre medio, pero no lo consigo, porfavor ayudenme ya no se que hacer Gracias.

PD: hice otro post que nadia tuvo la amabilidad de responderme:

http://www.forosdelweb.com/f45/como-configurar-version-requerida-mis-aplicaciones-976972/
  #2 (permalink)  
Antiguo 24/02/2012, 17:10
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 5 meses
Puntos: 454
Respuesta: Dolor de cabeza con JTable y Resultset

Hola:

Estp

while(bd.resultado!=null){

posiblemente no termina nunca.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 24/02/2012, 20:37
 
Fecha de Ingreso: abril-2011
Ubicación: lima
Mensajes: 134
Antigüedad: 12 años, 11 meses
Puntos: 3
Respuesta: Dolor de cabeza con JTable y Resultset

bueno prueba con esto, yo lo hago de la siguiente manera..

private Connection cn;
private PreparedStatement ps;
private ResultSetMetaData m;
private ResultSet rs;
DefaultTableModel dtm;
Código:
try{



Class.forName("org.h2.Driver");
        cn=DriverManager.getConnection("jdbc:h2:file:".concat(System.getProperty("user.dir")).concat("\\Data\\inv_data"),"sa","123");

    ps=cn.prepareCall("select nick,estado from mi tabla");

    m=ps.getMetaData(); // esto para saber el numero de filas..
    rs=ps.executeQuery();
    ArrayList<Object[]> datos=new ArrayList<>();
       while (rs.next()) {           
           Object[] filas =new Object[m.getColumnCount()];
           for (int i = 0; i < filas.length; i++) {
               filas[i]=rs.getObject(i+1);
           }
           datos.add(filas);
           
       }
       
           
       dtm=(DefaultTableModel)this.jTable1.getModel();

       for (int i = 0; i < datos.size(); i++) {
           dtm.addRow(datos.get(i));
       }
   }catch(Exception e){
      System.out.Println(null, "Se profujo un error\n" + e.getMessage());
       
   }
bueno la conexion es como ejemplo no no mas, de esta manera logras llenar el jtable, que previamente ya lo arrastraste de la paleta de controles en tu form... espero que te sirva..

Última edición por lincolnf_2; 24/02/2012 a las 20:47
  #4 (permalink)  
Antiguo 25/02/2012, 15:33
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 1 mes
Puntos: 0
Sonrisa Respuesta: Dolor de cabeza con JTable y Resultset

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

Estp

while(bd.resultado!=null){

posiblemente no termina nunca.

Se bueno.
Gracias por responder, pero esa sentencia ya la habia introducido :S y aún así no funciona.

Cita:
Iniciado por lincolnf_2 Ver Mensaje
bueno prueba con esto, yo lo hago de la siguiente manera..

private Connection cn;
private PreparedStatement ps;
private ResultSetMetaData m;
private ResultSet rs;
DefaultTableModel dtm;
Código:
try{



Class.forName("org.h2.Driver");
        cn=DriverManager.getConnection("jdbc:h2:file:".concat(System.getProperty("user.dir")).concat("\\Data\\inv_data"),"sa","123");

    ps=cn.prepareCall("select nick,estado from mi tabla");

    m=ps.getMetaData(); // esto para saber el numero de filas..
    rs=ps.executeQuery();
    ArrayList<Object[]> datos=new ArrayList<>();
       while (rs.next()) {           
           Object[] filas =new Object[m.getColumnCount()];
           for (int i = 0; i < filas.length; i++) {
               filas[i]=rs.getObject(i+1);
           }
           datos.add(filas);
           
       }
       
           
       dtm=(DefaultTableModel)this.jTable1.getModel();

       for (int i = 0; i < datos.size(); i++) {
           dtm.addRow(datos.get(i));
       }
   }catch(Exception e){
      System.out.Println(null, "Se profujo un error\n" + e.getMessage());
       
   }
bueno la conexion es como ejemplo no no mas, de esta manera logras llenar el jtable, que previamente ya lo arrastraste de la paleta de controles en tu form... espero que te sirva..
Gracias por tu metodo, pero lo prove y obtengo el mismisimo resultado que en los anteriores, se queda procesando indefinidamente. No se si lo conseguire nunca, dado que no hay problema. estan todos los metodos bien escritos y le da por no ir. ¿Porfavor alguna otra alternativa?
  #5 (permalink)  
Antiguo 25/02/2012, 16:32
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Dolor de cabeza con JTable y Resultset

por si esto ayuda acabo de darme cuenta que no solo me pasa con el jTable. he hecho otra clase para autentificarse (una especie de login) que checkea si existe dicho usuario y contraseña en la base de datos, pero cuando le doi al boton para autentificarme, como siempre, se queda procesando indefinidamente y nunca acaba. os dejo el codigo por si ayuda.

Código:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
      main.conexion bd = new main.conexion();
        String usuario = null;String passw=null;
        try{
            bd.ConectarBaseDeDatos();
            bd.resultado = bd.sentencia.executeQuery("SELECT * from cuentas where nombre = '"+user.getText()+"'");
            while(bd.resultado!=null){
            while (bd.resultado.next()){
        usuario = bd.resultado.getString("nombre"); //obtenemos la string de usuario
        passw = bd.resultado.getString("pass"); //obtenemos la string de contraseña
        }}
        if(usuario==null){
            JOptionPane.showMessageDialog(null, "El usuario introducido es incorrecto" );
        }else{
           
            String password = new String(pass.getPassword());
       
       
        if(passw.equals(password)){
            
            //AQUI ACTIVAR TODOS LOS CONTROLES!!!!!
            JOptionPane.showMessageDialog(null,"Login realizado con éxito");
    
            setVisible(false);
            
        }else{JOptionPane.showMessageDialog(null, "La contraseña introducida es incorrecta" );}
        }
            
        }catch(Exception e){}
    }
EDITO:

Hola, provando un poco mas creo que el problema esta en torno a la lectura del resultset8por lo menos en este ultimo codigo). si se queda ejecutando indefinidamente es que se ha metido en un bucle infinito, que no acaba nunca, y creo que es el de :
Código:
while(bd.resultado.next()){
blablablabla
}
Claro probe a obtener sin ese buqle pero claramente no deja, y da un error : before start of resultset

Espero que esto les ayude para ayudarme, porfavor ayudenme gracias.


2ª EDICION:

Ya he conseguido que me funcione el últimi código posteado, el del login, el problema era el que sospechaba, entraba en un bucle del que no salía, y tenía que ser un while, pero no era el que postee anteriormente (bd.resultado.next()) si no que que me aconsejaba chuidiang (while(bd.resultado!=null)). No entiendo por que pero siempre se quedaba distinto de null, por lo que no acababa nunca. removi esa sentencia y el codigo del login ya funciona normalmente y la mar de bien. Voi a probar si puedo solucionar lo dela tabla de la misma manera. Salu2 y comente soluciones a lo de la tabla please, que sigue siendo un problema.


ULTIMA EDICION:

FUNCIONA!!! :D :D :D elimine esa sentencia de "while(bd.resultado!=null)" y todo funciona correctamente, lo prove que el metodo que me aconsejo lincolnf_2 (muchas gracias) quitandole esa sentencia, y todo funcionó correctamente. No entiendo porque, y se me lo explican les estaría agradecido, pero la cosa es que al final lo conseguí. Muchas gracias a todos por sus esfuerzos :)

Última edición por soliddanii; 25/02/2012 a las 17:46
  #6 (permalink)  
Antiguo 26/02/2012, 09:56
 
Fecha de Ingreso: abril-2011
Ubicación: lima
Mensajes: 134
Antigüedad: 12 años, 11 meses
Puntos: 3
Respuesta: Dolor de cabeza con JTable y Resultset

hola, con respecto a lo del logeo, por que no utilizas un select count(*) de esta manera.

Código:
private PreparedStatement ps;
    public ResultSet rs;
    private Connection cn;

Código:
private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) { 

try{                                          

ps=cn.prepareStatement("select count(*) from cuentas where usuario=? and passw=?");
        ps.setString(1, this.txtUsuario.getText());
ps.setString(2,this.txtPassword.getText())
rs=ps.executeQuery();

while(rs.next()){
            if (rs.getString(1)=="1") {
            this.dispose();
           
        }
        else{
            JOptionPane.showMessageDialog(null,"Usuario o contraseña incorrectos..");
          
        }
        }       

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null,"Se produjo un error\n"+e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
    }
}
  #7 (permalink)  
Antiguo 26/02/2012, 10:06
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 5 meses
Puntos: 454
Respuesta: Dolor de cabeza con JTable y Resultset

Je,je, justo lo que te dije en la primera contestación, que ese while (bd.resultado!=null) no acababa nunca, pero no me entendiste. No quería que lo pusieras, sino que lo quitaras (ya vi que lo tenías puesto).

Entiendo que bd.resultado es el resultset y una vez que le asignes valo ... no será null hasta que no se lo quites

resultado.bd = statement.executeQuery(....);

no será null hasta que tú hagas

resultado.bd=null;

Que el ResultSet no de resultados o los consuma todos, no quiere decir que la variable (bd) que contiene el ResultSet se haga null.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #8 (permalink)  
Antiguo 26/02/2012, 15:21
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Dolor de cabeza con JTable y Resultset

Cita:
Iniciado por chuidiang Ver Mensaje
Je,je, justo lo que te dije en la primera contestación, que ese while (bd.resultado!=null) no acababa nunca, pero no me entendiste. No quería que lo pusieras, sino que lo quitaras (ya vi que lo tenías puesto).

Entiendo que bd.resultado es el resultset y una vez que le asignes valo ... no será null hasta que no se lo quites

resultado.bd = statement.executeQuery(....);

no será null hasta que tú hagas

resultado.bd=null;

Que el ResultSet no de resultados o los consuma todos, no quiere decir que la variable (bd) que contiene el ResultSet se haga null.

Se bueno.
aaa ok gracias xD

Etiquetas: jtable, mysql, netbeans, programa, resultset, aplicaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:40.