domingo, enero 06, 2008

Splash Screen con SwingWorker

Me han pedido que haga un ejemplo de una ventana de Bienvenida / Cargando con SwingWorker. El ejemplo en sí es bastante básico, pero creo que servirá para ilustrar el uso y una posible solución (quizá no la mejor de todas).

Esta pantalla (no estaba muy creativo) se va a mostrar cuando se inicie la aplicación (perdón por la calidad de la animación, creo que estoy decayendo en la calidad de los tutoriales):


Esta pantalla es el puntapié inicial para el resto de mi aplicación (es el que tiene el void main). Aquí se genera un worker que actualiza el label de descripción de carga. La actualización es realizada usando el Thread.sleep(); para que tenga exactamente 1 segundo de duración entre actualización y actualización. Veamos parte del código que lo realiza:



La clase MiSwingWorkerInit es una inner class de la ventana emergente WelcomeWindow. Básicamente, la clave de ejecución está en el método doInBackGround() el cual lo único que hace es seleccionar el mensaje que se mostrará. En una aplicación real, aquí deberían realizarse todas las actividades previas a la carga de la pantalla principal de la aplicación. Una aclaración adicional, si se fijan estoy usando el método this.setProgress(100); con el único propósito de que se ejecute un evento interno del swingworker. Este evento notificará a la aplicación general de que se ha terminado el proceso y que puede seguir cargando la pantalla principal.

¿Dónde se inicia el proceso del SwingWorker? En el siguiente código pueden visualizarlo:


Es bastante simple el inicio de su ejecución, lo único que hay que hacer es instanciar un objeto de SwingWorker y darle execute(). Pero hay algo más interesante aquí, la llamada al método addPropertyChangeListener(this); bueno, lo que hago aquí es pedirle al worker que me avise (en forma de evento) cuando ocurra algún cambio en alguna propiedad. Ahora, si se fijan en la primera porción de código, notará que esto ocurrirá cuando se invoque al método setProgress(100) del worker. Si bien esto se podría hacer como una clase anónima al mejor estilo eclipse y los actionPerformed, no me queda otra opción que declarar a la misma ventana para que implemente la interfaz PropertyChangeListener, ya que de otra manera, no podré llamar a setVisible(false).
Por supuesto, el implementar la interfaz, hace que deba tener en la clase el método propertyChange, de la siguiente manera:



Cuando en este método verifique que ha cambiado la propiedad "progress" (interna del SwingWorker), entonces puedo sacar la ventana de Cargando y mostrar la ventana Principal.

Fácil, ¿no?

Cualquier duda, no duden en consultar, les dejo el link con los fuentes (hecho en eclipse) aquí.

Saludos
Pablo

3 Comments:

At 11:45 a. m., Blogger Gorlok said...

En realidad si podrías usar una clase anónima para atender el evento, solamente que tenés que pasarle una referencia a this, por ej., como Clase.this (para distinguirlo del "this" de la anónima)... y como mucho que sea una referencia "final". Con eso no necesitarás extender de la interfaz.

Interesante el artículo, y como siempre muy bueno.

 
At 12:10 p. m., Blogger Pablo Frias said...

Gorlok: me has resuelto una duda que vengo acarreando hace años, y recién ahora que lo decís, lo encontré en The Java Tutorial. A veces realmente no me explico como se me pasan algunas cosas básicas.

Agradecido eternamente.

 
At 12:10 p. m., Anonymous Anónimo said...

Pablo ... tengo dudas sobre un programita que desarrolle en java, me gustaria que me escribas a diegopablomansilla@gmail.com, soy doordobes como voz.

Es sobre hilos, por alguna razon estos nunca mueren ....

 

Publicar un comentario

<< Home