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

Sincronicar UI y thread

Estas en el tema de Sincronicar UI y thread en el foro de Java en Foros del Web. Hola, a ver si me podéis resolver esta consulta. Yo tengo un formulario que al pinchar al botón "Aceptar" lleva a cabo algunas tareas como ...
  #1 (permalink)  
Antiguo 10/06/2008, 03:39
 
Fecha de Ingreso: junio-2008
Mensajes: 23
Antigüedad: 15 años, 10 meses
Puntos: 0
Busqueda Sincronicar UI y thread

Hola, a ver si me podéis resolver esta consulta.
Yo tengo un formulario que al pinchar al botón "Aceptar" lleva a cabo algunas tareas como introdución de datos en una BBDD y por otro lado realiza una copia de un archivo a una ubicación.
El problema es que la copia del archivo puede tardar con archivos de varios MB ya se se copian a una ruta de red. Para que el usuario no piense que el programa se ha colgado he puesto una progreessbar que indica el estado de lo copiado.
El problema lo tengo ya que esa progressbar y el proceso de copia nececitan estar en un thread aparte para que se refresque la interfaz. Pero si lo meto en un swingworker luego no se controlar cuando acaba.
Me gustaría saber como puedo hacer que el thread de manejador de eventos que crea el swingworker para la copia del archivo se espere a que este termine para luego realizar otras tareas sin congelar el refresco de la pantalla.

He probado a meter todo el proceso de edición del formulario en el swingworker, asi me quedaba todo bien sincrono, pero con el paso del tiempo me he dado cuenta de que el thread no cogía a veces bien los datos de la interfaz y esas veces me metía nulos en los campos de la bbdd. El código es este:

private class TareaEditarRegistro extends SwingWorker<Void, Void> {
private Component padre;

TareaEditarRegistro(Component padre) {
this.padre = padre;
}

@Override
public synchronized Void doInBackground() {
String consulta = "UPDATE " + Principal.REGISTRO_HIST + " SET " +
"Fecha=" + jFormattedTextField1.getFecha() + ", " +
"Situacion=" + jComboBox1.getItemSeleccionado() + ", " +
"Procedencia=" + jComboBox2.getItemSeleccionado() + ", " +
"Documentacion=" + jComboBox3.getItemSeleccionado() + ", " +
"Referencia=" + jTextField1.getTexto() + ", " +
"Cerrado=" + jCheckBox1.isSelected() + ", " +
"Observaciones=" + jTextPane1.getTexto() + " " +
"WHERE idHistorial='" + idHistorial + "'";

try {
conexion.ejecutaActualizacion(consulta);
insertaEnLogRegistro(idHistorial, consulta);
setModificado(true);
adjuntarArchivo(idHistorial);

} catch (SQLException ex) {
Log.getInstance().severe("Error en el acceso a la base de datos.\n" + ex.getMessage());
JOptionPane.showMessageDialog(padre, "Error en el acceso a la base de datos.\n" + ex.getMessage() + "\n", "Error",
JOptionPane.ERROR_MESSAGE);
cancel(true);
} catch (IOException ex) {
Log.getInstance().severe("Error en el acceso al disco. " + ex.getMessage());
JOptionPane.showMessageDialog(padre, "Error en el acceso al disco.\n" + ex.getMessage() + "\n", "Error",
JOptionPane.ERROR_MESSAGE);
cancel(true);
}

return null;
}

public void done() {
setTrabajando(false);

if (!isCancelled()) {
JOptionPane.showMessageDialog(padre, "Información actualizada correctamente.\n", "Información", JOptionPane.INFORMATION_MESSAGE);
}
}
}
....

TareaEditarRegistro tarea = new TareaEditarRegistro(this);
tarea.execute();
... mas tareas que deben esperar a termine el thread de arriba

Llevo tiempo leyendo y buscando soluciones pero no doy con la tela. ¿Alguna idea de como afrontar el problema ?.
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 20:56.