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 ?.