SwingWorker & SwingX


A los tiempos escribo.

El tema que les presentaré utiliza varias técnologías: SwingWorker, JXBusyLabel y Java Web Start. El propósito es mostrar cómo funcionan, en parte, cada una de ellas. Paso a explicar mis intenciones.

La aplicación es bastante sencilla, imagínese que al hacer clic en un botón se lanza una tarea que demara alguna cantidad significativa de tiempo, para señalarle al usuario que el programa está trabajando (y no dar la impresión que el programa se colgó) se muestra una animación. Luego que la tarea se ha cumplido la animación deja de trabajar. Para cumplir con lo propuesto se utiliza lo siguiente:

  • SwingWorker. Una especialización de la clase Thread, que permite realizar tareas ‘por debajo’ de la GUI. La clase SwingWorker crea un hilo que se encarga de hacer la tarea compleja para ello se cuenta con el método doInBackground y cuando la tarea concluye automáticamente se llama al método done. Además la clase SwingWorker trabaja con genéricos de tal forma que permite que el programador defina los tipos de datos de retorno del método doInBackground, en mi caso usé el tipo boolean.
protected Boolean doInBackground() throws Exception {
   int i = 0;

   while(i < 100 && !isCancelled()){
      Thread.sleep(100);
      i ++;
   }
  return true;
}

public void done(){
   try {
      etiqueta.setBusy(!get());
      boton.setEnabled(get());
   } catch (InterruptedException ex) {
      Logger.getLogger(Tarea.class.getName()).log(Level.SEVERE, null, ex);
   } catch (ExecutionException ex) {
      Logger.getLogger(Tarea.class.getName()).log(Level.SEVERE, null, ex);
   }
}
&#91;/sourcecode&#93;

Dentro del método <em><strong>done</strong></em> se puede ver que se existe una llamada al método get() que lo que hace es obtener el valor que retornó el método doInBackground en nuestro caso obtendría true. SwingWorker es un hilo que permite que el hilo que se encarga de la GUI siga trabajando sin interrumpirlo, de esa manera se dá se evita que la GUI se congele. Se creó un clase denominada Tarea que hereda de SwingWorker y posee propiedades del tipo JXBusyLabel y JButton que serán referencias a los elementos que se encuentran en el JFrame.

SwingWorker se encuentra definido desde la versión 1.6 así que es necesario contar con esa versión del JDK.
<ul>
	<li><a title="SwingX" href="http://swinglabs.org/" target="_blank">SwingX</a> es un conjunto de componentes que extienden a los existentes en Swing, entre esos componentes existen uno denominado JXBusyLabel que es un componente que muestra un grupo de líneas colocadas formando una circunferencia (existen otras formas de presentación), cada línea cambia de color dándole así una animación y el la idea de que se está trabajando y que espere hasta que se concluya con la tarea. Veamos el código</li>
</ul>

BusyPainter painter = new BusyPainter(
   new RoundRectangle2D.Float(0, 0, 15.000001f, 5.0f, 10.0f, 10.0f),
   new Ellipse2D.Float(7.5f, 7.5f, 35.0f, 35.0f));
painter.setTrailLength(4);
painter.setPoints(8);
painter.setFrame(-1);

jxblTrabajando.setPreferredSize(new Dimension(50, 50));
jxblTrabajando.setIcon(new EmptyIcon(50, 50));
jxblTrabajando.setBusyPainter(painter);

Aún estoy estudiando el código así que no puedo decir mucho, pero podemos ver que no es complicado. El objeto de la clase JXBusyLabel se denomina jxblTrabajando y utiliza la clase BusyPrinter para poder trabajar. Es importante decir que para iniciar la animación se debe llamar al método setBusy(true); en el programa que analizamos se ejecuta dicho método cuándo se hace clic en el botón Iniciar.

Las clases de SwingX son muchas y además existen otros proyectos como JXLayer, Timingframework que permiten hacer muchas otras cosas.

  • Finalmente Java Web Start es una tecnología Java que permite deployar (descargar e instalar) las aplicaciones desde una página Web superando algunos de los incovenientes que se presentan cuándo se instalan aplicaciones cliente – servidor, como por ejemplo la actualización ya que las aplicaciones JWS primero revisan si la versión de la aplicación instalada en el computador es la misma que la que se encuentra en el servidor, sino es así se descargará la última versión del servidor.  Para realizar ésto se utilizó las facilidades que posee NetBeans. Para ello se hizo clic derecho sobre el proyecto, propiedades y luego se busca la opción Web Start se habilita esa opción y listo. Cuando se hace un Clean&Build se generan un archivo jnlp y página html que contienen un link al archivo jnlp.  Antes de poder ejecutar las aplicaciones de ésta manera es necesario verificar que tú servidor Web maneje apropiadamente vía tipo MIME los archivo jnlp, verificando si existe la línea: application/x-java-jnlp-file JNLP . Mayores detalles puedes encontrarlos en Deploying Java Web Start Applications

Para ejecutar la aplicación vía Web Start clic aquí

En la aplicación se agregó un check box y un radio button con la final de mostrar cómo la tarea se ejecuta de manera independiente de la GUI. SwingLabs posee muchos componentes muy interesantes y útiles pueden ver los demás aquí y en algún momento la aplicación debería ser así

Para descargar el código haga clic aquí

Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s