Actualizar JTable
tema enviado por Fan-Shop en Java
tema iniciado el 27/04/2009
Hola les cuento, estoy desarrollando 1 proyecto el cual se basa en dos sistemas, el primero telefonista el cual es solo de ingresos a la BD y el segundo con una JTable el cual quiero ke se actualize automaticamente.
llevo unos buenos dias tratando de refrescarla automaticamente pero no lo he podido lograr lo que mas se acerca es un thread que elimina los registros y luego me levanta los datos, pero es muy notorio en la interfaz.
he intentado cargar los datos con un DefaultTableModel y con AbstractTableModel el cual lo he logrado pero no actualizarlo.
estuve buscado y encontre un metodo llamado fireTableRowsUpdated pero no lo he podido aplicar. les dejo el codigo del JTable DefaultTableModel el cual sta fino devido a que de antes lo ocupava
DefaultTableModel:
public class CarreraEnCurso extends javax.swing.JInternalFrame{
//Thread blink;
DefaultTableModel modelo = new DefaultTableModel();
Conecta bdd;
ResultSet resultado;
JFrame frame;
String num_movil;
Object [] fila = new Object[8];
public String Estado;
//public boolean Estado=false;
/** Creates new form CarreraEnCurso */
public CarreraEnCurso() {
// Get the titlebar and set it to null
setRootPaneCheckingEnabled(false);
//javax.swing.plaf.InternalFrameUI ui= frame.getUI();
((javax.swing.plaf.basic.BasicInternalFrameUI)ui).setNorthPane(null);
// blink = new Thread(this);
//blink = new Thread(this);
//blink.start();
bdd = new Conecta();
initComponents();
//Llenar ComboBox Registro
try { //Cargar ComboBox con datos de la BD en este caso datos de movil
resultado = bdd.Mostrar("SELECT Id_registro FROM registro WHERE registro.Estado_registro ='Pendiente' or registro.Estado_registro ='En Curso'" );
while( resultado.next() ) {
String txt = resultado.getString("Id_registro");
this.id_registroBox.addItem(txt);
}
bdd.sentencia.close();
bdd.conexion.close();
}catch( Exception e ) {
System.out.println( e );
return;
}
//Llenar tabla
try {
resultado = bdd.Mostrar( "SELECT registro.Id_registro,registro.Nom_empresa,registro.Num_movil,registro.Nom_pasajero,registro.Fecha_pedido, registro.Hora_pedido,registro.Estado_registro, registro.Origen FROM registro WHERE registro.Estado_registro ='Pendiente' or registro.Estado_registro ='En Curso'" );
// Creamos las columnas.
modelo.addColumn("Id Registro");
modelo.addColumn("Empresa");
modelo.addColumn("Nº Movil");
modelo.addColumn("Nom. Pasajero");
modelo.addColumn("Fecha Pedido");
modelo.addColumn("Hra. Pedido");
modelo.addColumn("Estado Carrera");
modelo.addColumn("Origen");
// Bucle para cada resultado en la consulta
while (resultado.next())
{
// Se crea un array que sera una de las filas de la tabla.
//Object [] fila = new Object[8]; // Hay 12 columnas en la tabla
// Se rellena cada posician del array con una de las columnas de la tabla en base de datos.
for (int i=0;i<8;i++)
fila[i] = resultado.getObject(i+1); // El primer indice en resultado es el 1, no el cero, por eso se suma 1.
// Se añade al modelo la fila completa.
modelo.addRow(fila);
}
jTable1.setModel(modelo);
bdd.sentencia.close();
bdd.conexion.close();
}catch( Exception e ) {
System.out.println( e );
return;
}
}
AbstractTableModel:
public class ModeloTablaResultados extends AbstractTableModel {
private Connection conexion;
private Statement instruccion;
private ResultSet conjuntoResultados;
private ResultSetMetaData metaDatos;
private int numeroDeFilas;
Thread runner;
// mantener el registro del estado de la conexión a la base de datos
private boolean conectadoALaBaseDeDatos = false;
// inicializar conjuntoResultados y obtener su objeto de meta datos;
// determinar el número de filas
public ModeloTablaResultados( String controlador, String url,
String consulta ) throws SQLException, ClassNotFoundException {
// cargar clase de controlador de base de datos
//Thread runner = new Thread(this);
//runner.start();
Class.forName( controlador );
// conectarse a la base de datos
conexion = DriverManager.getConnection( url );
// crear objeto Statement para consultar la base de datos
instruccion = conexion.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY );
// actualizar estado de conexión a la base de datos
conectadoALaBaseDeDatos = true;
// establecer consulta y ejecutarla
establecerConsulta( consulta );
}
// obtener la clase que representa al tipo de columna
public Class getColumnClass( int columna ) throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// determinar la clase de Java de columna
try {
String nombreClase = metaDatos.getColumnClassName( columna + 1 );
// devolver objeto Class que representa a nombreClase
return Class.forName( nombreClase );
}
// atrapar excepciones SQLException y ClassNotFoundException
catch ( Exception excepcion ) {
excepcion.printStackTrace();
}
// si ocurren problemas arriba, suponer que es tipo Object
return Object.class;
}
// obtener el número de columnas en el objeto ResultSet
public int getColumnCount() throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// determinar el número de columnas
try {
return metaDatos.getColumnCount();
}
// atrapar excepciones SQLException e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// si ocurren problemas arriba, devolver 0 para el número de columnas
return 0;
}
// obtener el nombre de una columna específica en el objeto ResultSet
public String getColumnName( int columna ) throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// determinar el nombre de la columna
try {
return metaDatos.getColumnName( columna + 1 );
}
// atrapar excepciones SQLException e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// si hay problemas, devolver cadena vacía para el nombre de la columna
return "";
}
// devolver el número de filas en el objeto ResultSet
public int getRowCount() throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
return numeroDeFilas;
}
// obtener el valor en una fila y columna específicas
public Object getValueAt( int fila, int columna ) throws IllegalStateException {
/***********************************/
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// obtener un valor en una fila y columna específicas del objeto ResultSet
try {
conjuntoResultados.absolute( fila + 1 );
return conjuntoResultados.getObject( columna + 1 );
}
// atrapar excepciones SQLExceptions e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// si hay problemas, devolver objeto cadena vacía
return "";
}
// establecer nueva cadena de consulta para la base de datos
public void establecerConsulta( String consulta )throws SQLException, IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// especificar consulta y ejecutarla
conjuntoResultados = instruccion.executeQuery( consulta );
// obtener meta datos para el objeto ResultSet
metaDatos = conjuntoResultados.getMetaData();
// determinar el número de filas en el objeto ResultSet
conjuntoResultados.last(); // mover a la última fila
numeroDeFilas = conjuntoResultados.getRow(); // obtener número de fila
// notificar al objeto JTable que el modelo ha cambiado
fireTableStructureChanged();
}
/*public void run() {
//while (true) {
// updateStocks();
fireTableRowsUpdated(0, - 1);
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
}
//}
}*/
// cerrar objetos Statement y Connection
public void desconectarDeLaBaseDeDatos() {
// cerrar objetos Statement y Connection
try {
instruccion.close();
conexion.close();
}
// atrapar excepciones SQLException e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// actualizar estado de conexión a la base de datos
finally {
conectadoALaBaseDeDatos = false;
}
}
} // fin de la clase ResultSetTableModelodel