[Solucionado] JAVA Como Refrescar JTable

Iniciado por MiguelP, 19 Marzo 2014, 17:32 PM

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

MiguelP

Muchas gracias por la ayuda amigo, hice exactamente lo que dices es mas puse un print y me sale que hace el select * from mitabla pero no se refresca el JTable... es mas puse

tblDatos .setModel(agregarFila(modelo));

y tampoco...se ejecuta el select pero no refresca el jtable que crees que pueda hacer

Mitsu

#11
Hola de nuevo,

Cambia esto:
Código (=java) [Seleccionar]

while(rs.next()) {
     for(byte i=0; i<columnas; i++) {
          data[i] = resultmeta.getObject(i+1);
     }
}


Por esto:

Código (=java) [Seleccionar]

while(rs.next()) {
     data[0] = (String) resultmeta.getString("nombreColumna");
     // asi con las demas propiedades. El casting de acuerdo al tipo de dato
     if(rs.next() == null) { modelo.addRow(data); } // si ya no hay filas en la tabla se inserta la fila en la JTable
}


Fuera del while imprime el array data para ver los datos que han sido recuperados de la database:

Código (=java) [Seleccionar]

for(Object e : data) {
System.out.println("Valor:"+e+"\tTipo de dato: "+e.getClass().getName());
}

MiguelP

Hola que tal Mitsu. probé tu código y tengo un problema para empezar tu me lo pasas de un modo yo lo tenia de otro y lo adecue te lo pongo para saber si hace lo mismo:

public DefaultTableModel agregarFila(DefaultTableModel modelo) throws SQLException {

Conexion conn = new Conexion();
    Statement sf = conn.getConnection().createStatement();
    String cadena = "Select * from Cliente";
    ResultSet rs = sf.executeQuery(cadena);
    System.out.println(cadena);
ResultSetMetaData rsMd = rs.getMetaData();
int CantidadColumnas = rsMd.getColumnCount();

Object datos[]=new Object[CantidadColumnas];
        try {
            /*while (rs.next()) {
                for (int i = 0; i <CantidadColumnas; i++) {
                        datos[i] = rs.getObject(i + 1);
                      //  System.out.println("fil : "+datos[i]);
                }
                modelo.addRow(datos);
               
            }
rs.close();
        } catch (Exception e) {
        e.printStackTrace();
        }
    return modelo;
}




lo saque y puse lo que me sugeriste :

public DefaultTableModel agregarFila(DefaultTableModel modelo) throws SQLException {
            Conexion conn = new Conexion();
    Statement sf = conn.getConnection().createStatement();
    String cadena = "Select * from Cliente";
    ResultSet rs = sf.executeQuery(cadena);
    System.out.println(cadena);
ResultSetMetaData rsMd = rs.getMetaData();
int CantidadColumnas = rsMd.getColumnCount();

Object datos[]=new Object[CantidadColumnas];
        try {
while(rs.next()) {
             datos[0] =(String) ((ResultSet) rsMd).getString("Codigo");
             datos[1] =(String) ((ResultSet) rsMd).getString("Nombre");
             datos[2] =(String) ((ResultSet) rsMd).getString("Apellido");
             // asi con las demas propiedades. El casting de acuerdo al tipo de dato
             if(rs.next()=null) { modelo.addRow(datos); } // si ya no hay filas en la tabla se inserta la fila en la JTable
        }
       
        for(Object e : datos) {
        System.out.println("Valor:"+e+"\tTipo de dato: "+e.getClass().getName());
        }
       
            rs.close();
        } catch (Exception e) {
        e.printStackTrace();
        }
    return modelo;
}



tengo el problema que el if(rs.next()=null) { modelo.addRow(datos); } no puedo igualarlo me dice que no es un argumento recibido == para tipos boolean.


Espero me puedas ayudar para poder terminar este tema, ah para probar cree un botón en mi clase formulario y le puse el refrescarDatos y me actualiza la lista -.- osea nose xq no sale así automático...espero tu respuesta amigo saludos.

Te comento que estoy trabajando con JAVA y oracle saludos.

Mitsu

#13
Saca esa línea, tiene que quedarte así:

Código (=java) [Seleccionar]

while(rs.next()) {
// asignas los datos al array data con sus castings respectivos
modelo.addRow(data);
}

for(Object e : data) {
System.out.println("Valor: "+e+"\tTipo de dato: "+e.getClass().getName());
}


NOTA: Los flujos se cierran siempre en un finally, ya que así ocurra una excepción nos aseguramos que la conexión se haya cerrado.

Código (java) [Seleccionar]

try {
// conexion a db y demas
} catch(SQLException ex) { throw ex; }
finally { if(conexion != null) conexion.close(); }


Pega lo que imprime, para saber si se está guardando la información de la tabla en el array con su correspondiente tipo de dato. Salu2.

PD: Si le pasas por parámetro el modelo de la tabla, ¿para qué la devuelves nuevamente? ¿Estás haciendo algo así no?

Código (=java) [Seleccionar]

JTable tblDatos = new JTable();
DefaultTableModel modelo = new DefaultTableModel();
modelo = agregarFila(modelo);
tblDatos.setModel(modelo);


Pero no sería necesario. Acuérdate que en Java el paso es por referencia (tipo punteros en C++), por lo que solamente bastaría con un agregarFila(modelo); y el cambio se reflejaría en el modelo. Ej.:

Código (=java) [Seleccionar]

DefaultTableModel modelo = new DefaultTableModel();
JTable tblDatos = new JTable(modelo);
// aqui el paso es por referencia por lo que solo basta hacer esto
this.agregarFila(modelo); // y se agrega la fila al modelo.

MiguelP

Hola Mitsu llegue a resolver mi problema de la siguiente manera:

En mi clase formulario herede los botones de mi clase JDialog y ahí hice lo siguiente :

jd.getBtnAceptarC().addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

((DefaultTableModel) tablabd.getModel()).addRow(new Object[]           {jd.ListaCaja.get(0).getText(),jd.ListaCaja.get(1).getText(),jd.ListaCaja.get(2).getText()});   
}
});



Es decir cada vez que hago un insert agrego una fila con los campos ingresados en mi JDialog y los pega en el JTable con esto puedo salir del problema.

Te agradezco por toda la ayuda y estaré en contacto para próximas dudas saludos.

Mitsu

#15
Listo, me alegra que se haya solucionado tu problema. Por eso te decía, que primero siempre se agrega el modelo a la JTable y recién se empieza a agregar datos. Cualquier duda, puedes postearla en ElHacker.net que seguro te apoyaremos.

Como última recomendación, te invito a que investigues sobre buenas prácticas de programación, cómo trabajar con bases de datos y patrones de diseño. Con ésto, tendrás un código muy limpio y entendible. Recuerda además, comentar siempre tus códigos, así cuando otro lo vean, sepan qué hace el código y no se pierda intentando decifrarlo.

Un saludo amigo.

PD: Edita el tema y coloca [Solucionado] antes del tema.

Debci

Grandes respuestas, Mitsu! :)

Cierro el post!

Saludos

Debci

El mensaje '[Solucionado] JAVA Como Refrescar JTable' fue bloqueado
Tópico completamente explotado. Gracias por traernos tu duda :) Ahora otros como tú podrán beneficiarse de esta solución :)
Leer reglas:
http://foro.elhacker.net/reglas