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

JTable No actualiza datos

Estas en el tema de JTable No actualiza datos en el foro de Java en Foros del Web. Hola a todos!!! Estoy haciendo un programa de proyecto para mi escuela, y necesito ayuda... He usado JTable para que se representen en tablas de ...
  #1 (permalink)  
Antiguo 14/09/2013, 01:07
 
Fecha de Ingreso: octubre-2008
Mensajes: 147
Antigüedad: 15 años, 6 meses
Puntos: 3
Exclamación JTable No actualiza datos

Hola a todos!!!

Estoy haciendo un programa de proyecto para mi escuela, y necesito ayuda...

He usado JTable para que se representen en tablas de dos columnas unos datos que extraigo de una base de datos MySQL.

La cosa es: SI FUNCIONA, extrae correctamente los datos y los muestra en la tabla, PERO cuando agrego un dato nuevo a la base de datos y vuelvo a llamar a mi clase TablaVisualizarDatos sucede que no muestra las actualizaciones y tengo que cerrar el programa y volverlo a cargar para que se muestren los datos agregados a la base de datos mientras el programa estaba en ejecución.


¿Alguien por favor podría ayudarme a resolver este inconveniente?, la verdad ya no logro dar con una...


Código:
package calcularestadisticas;

import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.JScrollPane; 
import javax.swing.JFrame; 
import java.awt.*; 
import java.awt.event.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;

public class TablaVisualizarDatos extends JFrame { 
    
    public TablaVisualizarDatos() {
    super("Datos Capturados");
    }

    void VisualizarDatos() {
        


//Ajusto mi ventana al centro de la pantalla
this.setLocationRelativeTo(null);
//creamos el arreglo de objetos que contendra el 
//contenido de las columnas 
Object[] dato = new Object[2];

// creamos el modelo de Tabla 
DefaultTableModel dtm = new DefaultTableModel();

dtm.addColumn("Valor Ingresado");
dtm.addColumn("Cantidad de Veces");

try{
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/calculadoraestadistica","root","jrmiron85");
        //JOptionPane.showMessageDialog(null, "La conexion se ha realizado con exito");
        Statement estado = (Statement) con.createStatement();
        
        String Consultar = "SELECT ID, Valor, COUNT( * ) as repetidos FROM datos GROUP BY Valor HAVING COUNT( * ) > 0";
        //JOptionPane.showMessageDialog(null, Agregar);   
        
        ResultSet resultado = estado.executeQuery(Consultar);
        //JOptionPane.showMessageDialog(null, "El dato: "+Dato+" fue capturado exitosamente.");
        System.out.println("Consulta de valores a la Base de Datos exitosa.");
                    
        while(resultado.next()){
            
            dato[0] = resultado.getString("Valor");
            dato[1] = resultado.getString("repetidos");
            
            dtm.addRow(dato);
            
            
            } 
            
            
            }
        
        
        catch(SQLException ex){
            JOptionPane.showMessageDialog(null,"Error de mysql");
        }
        catch(ClassNotFoundException e){
        }
        catch(Exception e){
            JOptionPane.showMessageDialog(null, "Se ha encontrado un error que es: "+e.getMessage()+"");
        }  

// se crea la Tabla con el modelo DefaultTableModel 
final JTable table = new JTable(dtm);

//se define el tamaño 
table.setPreferredScrollableViewportSize(new Dimension(250, 300));

//Creamos un JscrollPane y le agregamos la JTable 
JScrollPane scrollPane = new JScrollPane(table);

//Agregamos el JScrollPane al contenedor 
getContentPane().add(scrollPane, BorderLayout.CENTER);

//manejamos la salida 
addWindowListener(new WindowAdapter() { 
    
}); 

    this.pack();
    this.setVisible(true);
    }

}
  #2 (permalink)  
Antiguo 14/09/2013, 03:37
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: JTable No actualiza datos

Hola:

¿Qué quiere decir "vuelvo a llamar a mi clase"? ¿Cómo haces eso?

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 14/09/2013, 06:47
 
Fecha de Ingreso: octubre-2008
Mensajes: 147
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: JTable No actualiza datos

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

¿Qué quiere decir "vuelvo a llamar a mi clase"? ¿Cómo haces eso?

Se bueno.

Hola, llamo a mi clase desde otro JFrame, primero instancié y después llamé, así:

Así instancié:
Código:
    TablaVisualizarDatos VerDatos = new TablaVisualizarDatos();

Así llamo a la clase cada que aprieto el botón del menú en mi JFrame principal:
Código:
private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        VerDatos.VisualizarDatos();
    }
  #4 (permalink)  
Antiguo 14/09/2013, 13:59
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: JTable No actualiza datos

Cada vez que llamas a VisualizarDatos creas un nuevo JScrollPane, JTable y modelo y lo añades a la ventana... en la misma posición que el que habías añadido antes (CENTER). Estos JTables que vas añadiendo una y otra vez quedan uno encima de otro, es posible que el que acabas de añadir quede detrás del que tenías antes y no se vea.

También hay otro problema y es que si a una ventana que está visible le añades componentes nuevos, estos no se visualizan hasta que llames al método updateUI() (no vale repaint() ni otros, tiene que ser updateUI()).

El método correcto de hacer esto no es crear cada vez el JTable entero desde cero. Crea el JTable y añádelo en el constructor de la clase. El método VisualizarDatos() debería hacer algo como esto:

Código Java:
Ver original
  1. void VisualizarDatos() {
  2.    // conexión y consulta a base de datos
  3.    TableModel modelo = jTableQueInstanciasteEnElConstructor.getModel();
  4.    // borrar los datos en el modelo
  5.    // metero en el modelo los datos que has leido de base de datos

y con eso vale. Modificando los datos en el modelo que está dentro del JTable, el JTable se actualiza él solito.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 14/09/2013, 14:40
 
Fecha de Ingreso: octubre-2008
Mensajes: 147
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: JTable No actualiza datos

Cita:
Iniciado por chuidiang Ver Mensaje
El método correcto de hacer esto no es crear cada vez el JTable entero desde cero. Crea el JTable y añádelo en el constructor de la clase. El método VisualizarDatos() debería hacer algo como esto:

Código Java:
Ver original
  1. void VisualizarDatos() {
  2.    // conexión y consulta a base de datos
  3.    TableModel modelo = jTableQueInstanciasteEnElConstructor.getModel();
  4.    // borrar los datos en el modelo
  5.    // metero en el modelo los datos que has leido de base de datos

y con eso vale. Modificando los datos en el modelo que está dentro del JTable, el JTable se actualiza él solito.

Se bueno.
Por favor discúlpame, sé que me enviarás directita a leer un libro, pero no te entendí casi nada, estoy apenas cursando mi primer semestre en programación orientada a objetos y no es por culpar a mi maestro pero no nos explica nada...

Básicamente no sé que sea eso de "Borrar los datos en el modelo" y lo del constructor sé cuál es, pero si muevo el "DefaultTableModel dtm = new DefaultTableModel();" dentro del constructor (sacándolo del método) entonces en mi método "dtm" ya no es reconocido, y me da errores...

Ok... sé que quizá necesite una explicación un poco más para niñas tontas (más simple con un ejemplo)...
  #6 (permalink)  
Antiguo 15/09/2013, 00:09
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: JTable No actualiza datos

Hola:

Para poder ver el modelo en todos los métodos, debes sacar la variable para que sea atributo de la clase

Código Java:
Ver original
  1. public class UnaClase {
  2.     private DefaultTableModel modelo;
  3.  
  4.     public UnaClase() {
  5.          modelo = new DefaultTableModel();
  6.     }
  7.  
  8.    public void  unMetodo() {
  9.         // Aquí tienes accesible el modelo
  10.        modelo.unMetodoDelModelo();
  11.    }
  12. }

Si haces esto con el modelo, no necesitas hacer el TableModel modelo = jTableQueInstanciasteEnElConstructor.getModel(); que te indiqué anteriormente, puesto que ya lo tienes disponible.

Si miras la api de DefaultTableModel http://docs.oracle.com/javase/7/docs...ableModel.html verás los métodos que tiene. En el DefaultTableModel están todos los datos que se muestran en el JTable y basta cambiar esos datos en el modelo para que el JTable refleje automáticamente los cambios. Así que si tus datos en la base de datos cambian, sólo tienes que hacer esos cambios en el modelo. Lo más sencillo es borrarlos todos en el modelo y volver a rellenarlo con los datos nuevos.

Para borrar

modelo.setNumRows(0);

Para ir añadiendo las nuevas filas, como estabas haciendo

Código Java:
Ver original
  1. while(resultado.next()){
  2.            
  3.             dato[0] = resultado.getString("Valor");
  4.             dato[1] = resultado.getString("repetidos");
  5.            
  6.             modelo.addRow(dato);
  7.            
  8.            
  9.             }

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 15/09/2013, 14:04
 
Fecha de Ingreso: octubre-2008
Mensajes: 147
Antigüedad: 15 años, 6 meses
Puntos: 3
De acuerdo Respuesta: JTable No actualiza datos

Cita:
Iniciado por chuidiang Ver Mensaje

Se bueno.

Amigo muchas gracias!!! ya funciona perfectamente la parte de que se actualizan los datos, una pregunta final: ¿Existe la forma de evitar que cuando le des doble click a las celdas NO TE PERMITA editar el dato?

Gracias =)

Última edición por dfmex; 15/09/2013 a las 14:19 Razón: Arreglé el error que decía tener.
  #8 (permalink)  
Antiguo 16/09/2013, 01:13
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: JTable No actualiza datos

En vez de meter un DefaultTableModel, tienes que hacer una clase que herede de DefaultTableModel y sobreescribir el método isCellEditable() para que devuelva false

Código Java:
Ver original
  1.     @Override
  2.     public boolean  isCellEditable(int rowIndex, int vColIndex) {
  3.         return false;
  4.     }
  5. }
  6.  
  7. JTable tabla = new JTable(modelo);

Tienes más detalles en el apartado 3 de http://chuwiki.chuidiang.org/index.php?title=JTable

Se buena.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: clase, jtable, programa, string
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 14:22.