Refresco modelo DefaultTableModel

topfired2
20 de Noviembre del 2004
Hola, a ver si me podeis ayudar.
Llo que quiero hacer es cargar todo una serie de datos. Para ello miro primero si hay datos si es asi los borro. Y entonces
leo los nuevos datos de una Bd y los cargo en el modelo. La carga inicial la hace bien, pero cuando vuelve a cargar y hace el borrado no refresca bien. En cambio si le pongo un tiempo de espera si que refresca bien.

Este es el codigo :

private void borraModelo() {
if (modelo.getRowCount() > 0) {
int rows = modelo.getRowCount();
for (int i = 0; i < rows; i++) {
modelo.removeRow(0);
}
try { //No se :), tiempo de Actualización ?
Robot ast = new Robot();
ast.delay(1000);
}
catch (Exception e) {}

}
}
public void cargaDatos() {
this.borraModelo();
SimpleDateFormat as = new SimpleDateFormat("dd-MM-yyyy");
try {
datos = refAcceso.cargar_Datos(this.refObra);
for (int i = 0; i < datos.size(); i++) {
Personal nuevo = (Personal) datos.get(i);
Vector addNuevo = new Vector();
addNuevo.add(nuevo.getNumFactura());
addNuevo.add(as.format(nuevo.getFecha()));
addNuevo.add(nuevo.getProveedor());
addNuevo.add(nuevo.getConcepto());
addNuevo.add(nuevo.getNeto().toString());
addNuevo.add(nuevo.getIva().toString());
addNuevo.add(nuevo.getTotal());
addNuevo.add(as.format(nuevo.getFecha()));
addNuevo.add(nuevo.getSaldo());
modelo.addRow(addNuevo);
}
}
catch (Exception e) {
System.out.println(e);
}
}

No se porque hace esto y si le pongo el tiempo de espera, se hace un poquito lento.
Gracias de antemano y un Saludo.

chuidiang
20 de Noviembre del 2004
No sé muy bien lo que estás haciendo, pero te cuento una tontería a ver si es eso.

En java hay un hilo que es el encargado de atender las pulsaciones de botones y los refrescos de pantalla.

Si como consecuencia de la pulsacion de un boton (un ActionListener), te dedicas a echar muchas cuentas (consultas a BD, etc, etc), mientras estás haciendo todo eso, las ventanas no se refrescan ni se atiende al ratón.

Prueba a meter todo el tema del borrado y carga de base de datos en un hilo distinto.

Más o menos esto, aunque te lo pongo de memoria y no he compilado nada...

public void actionPerformed (ActionEvent e)
{
Thread hilo = new Thread (new Runnable () {
public void run ()
{
// Aqui tu codigo
}
};
hilo.start();
}

Se bueno.

topfired2
20 de Noviembre del 2004
gracias por contestar chudiag, he probado lo que me has dicho y casi casi me ha funcionado, efencivamente lo llamo desde un boton, lo que hago es borrar un registro de la base de datos y vovel a cargar la lista de la base de datos.
Ahora con el codigo que me has puesto el refresco funciona a medias, la primera vez me lo hace mal, pero las siguientes si que lo hace bien. He probado varias combinaciones , poner la eliminizaion y el refresco en thread, solo el refresco y tal, pero nada.

void jButton1_actionPerformed(ActionEvent e) {
if (this.cFactura.getText().length()>0){
String IdObra=this.refVentana.obraSeleccionada;
String numFact=cFactura.getText();
boolean existe=this.refVentana.acceso.isNumFacturaExists(IdObra,numFact);
if (existe){
Actualiza tread=new Actualiza(this,IdObra,numFact);
tread.start();
// this.listaF.cargaDatos();//refrescamos lista borrar
// this.refVentana.facturas.forml.cargaDatos(); //refrescamos lista
}else{
JOptionPane.showMessageDialog(null,
"No se ha encontrado la factura :"+numFact+" de la obra : "+IdObra,
"ATENCION!!",
JOptionPane.ERROR_MESSAGE);

}
}
}//Fin Boton Borrar

public class Actualiza extends Thread {
public facturasBorrar ref;
public String idObra;
public String numFactura;
public Actualiza(facturasBorrar from,String id,String numF) {
this.ref= from;
this.idObra=id;
this.numFactura=numF;
}
public void run() {
ref.refVentana.acceso.removeFactura(this.idObra,this.numFactura);
ref.listaF.cargaDatos();//refrescamos lista borrar
ref.refVentana.facturas.forml.cargaDatos(); //refrescamos lista
}
}