Diferentes Métodos para SwingWorker()

Servicios de Desarrollo Web, Software y Aplicaciones moviles, & Soporte tecnico, blog oficial de tecnologia y mas

Diferentes Métodos para SwingWorker()

Lenguaje java

¿Que es SwingWorker?

Es una clase abstracta desarrollada para la biblioteca Swing de Java, SwingWorker() se utiliza cuando hay procesos en segundo plano. 

Su propósito es ejecutar tareas de interacción con la interfaz gráfica (GUI) de manera prolongada en un hilo de fondo. Aquí tienes los puntos clave:

Función de SwingWorker:

  • Ejecución en segundo plano: Permite realizar tareas largas sin bloquear la interfaz de usuario.
  • Actualizaciones de la UI: Proporciona actualizaciones a la GUI mientras se procesa la tarea.
  • Métodos clave:
    • doInBackground(): Debe implementarse para realizar la computación en segundo plano.
    • process(): Notifica cambios intermedios a la GUI.
    • done(): Se ejecuta cuando la tarea está completa.

En resumen, SwingWorker es útil cuando necesitas ejecutar una tarea prolongada en un hilo de fondo y mantener la interfaz gráfica receptiva.

Los métodos publish() y process() son utilizados en conjunto con SwingWorker() para comunicarse con la interfaz de usuario de manera segura.

Cuando se están realizando tareas en segundo plano. Aquí te explico cómo se utilizan:

  1. publish(): Este método se utiliza dentro del método doInBackground() para enviar datos intermedios desde el hilo de fondo al hilo de eventos de Swing.
    • Puede ser útil cuando tienes resultados parciales de una tarea que deseas mostrar en la interfaz de usuario mientras la tarea continúa.

class MySwingWorker extends SwingWorker {
@Override
protected Void doInBackground() throws Exception {
// Realizar tarea en segundo plano
for (int i = 0; i < 100; i++) {
// Realizar algún cálculo
String resultadoParcial = calcularResultadoParcial(i);
publish(resultadoParcial); // Enviar resultado parcial al hilo de eventos
}
return null;
}

@Override

protected void process(List<String> chunks) {

    // Actualizar la interfaz de usuario con resultados parciales

    for (String resultadoParcial : chunks) {

        actualizarInterfazConResultadoParcial(resultadoParcial);

    }

}

}

2. process(): Este método se utiliza para procesar los datos intermedios enviados desde publish() en el hilo de eventos de Swing.

Es aquí donde puedes actualizar componentes de la interfaz de usuario con los datos parciales.

El método process() recibe una lista de chunks (trozos) de datos publicados.

Cada llamada a publish() puede contener varios datos intermedios, y process() se encarga de manejarlos en el hilo de eventos.

En resumen, publish() y process() son herramientas valiosas para mantener la interfaz de usuario actualizada con datos parciales mientras SwingWorker realiza una tarea en segundo plano.

Esto evita bloqueos y mantiene la interfaz de usuario receptiva.

SwingUtilities.invokeLater() y SwingUtilities.invokeAndWait() son métodos proporcionados por la clase SwingUtilities en Java Swing para ejecutar código en el hilo de eventos de Swing.

Estos métodos son útiles cuando necesitas actualizar la interfaz de usuario desde un hilo de fondo de manera segura.

Ya que todos los cambios en la interfaz de usuario deben realizarse en el hilo de eventos de Swing para evitar problemas de concurrencia.

Aquí te explico cómo usar estos métodos:

  1. SwingUtilities.invokeLater(): Este método se utiliza para ejecutar código en el hilo de eventos de Swing de forma asíncrona.
    • Es útil cuando deseas realizar cambios en la interfaz de usuario desde un hilo de fondo sin bloquear la ejecución.
  2. SwingUtilities.invokeAndWait(): Este método se utiliza para ejecutar código en el hilo de eventos de Swing de manera síncrona.
    • Esto significa que el hilo de fondo se bloqueará hasta que el código se haya ejecutado en el hilo de eventos.
    • Este método es útil cuando necesitas asegurarte de que una operación en la interfaz de usuario se complete antes de continuar con el hilo de fondo.
    • Sin embargo, debes tener cuidado para evitar bloqueos mutuos.

En resumen, SwingUtilities.invokeLater() y SwingUtilities.invokeAndWait() son herramientas esenciales para garantizar la actualización segura de la interfaz de usuario.

Desde hilos de fondo en una aplicación Swing.

Utiliza estos métodos según tus necesidades y el flujo de tu programa para mantener la interfaz de usuario receptiva y evitar problemas de concurrencia.

A continuación te muestro una aplicación real de un proceso en segundo plano con SwingWorkers() con SwingUtilities.invokeAndWait():

int seleccion=jTable_ListDocumentos.rowAtPoint(evt.getPoint());
int start= 0;

final SwingWorker worker = new SwingWorker(){

@Override

 protected Object doInBackground() throws Exception {

    Thread.sleep(1000);

    SwingUtilities.invokeAndWait(() -> {

        ObtencionDatosMouseClic(seleccion);                    // proceso

    });

    Thread.sleep(1000);

    jLblAnimacion.setVisible(false);

    dispose();

    return null;

  }

};

new Thread(()->{

     encenderanime();             // hilo secundario es opcional

}).start();

worker.execute(); 

Todo el código anterior esta dentro del evento MouseClicked del Jtable, Aparte de su funcionamiento.

Este código con SwingUtilities.invokeAndWait() –> hace que los procesos se bloqueen y los procesos internos corran sin ninguna interrupción.

Mas información: BuscarJavaPlatform

Espero que les ayude saludos!!

 

Deja un comentario