http://www.javaHispano.org
Copyright (c) 2003, Sergio Alonso Burgos. Este documento puede ser distribuido solo bajo los
términos y condiciones de la licencia de Documentación de javaHispano v1.0 o posterior (la última
versión se encuentra en http://www.javahispano.org/licencias/).
Como realizar una Ventana de Splash
:
» Informar al usuario de la aplicación sobre temas como el copyright, nombre
del autor y el proceso de carga.
» Entretener al usuario mientras que el proceso de carga de la aplicación (que
en ocasiones puede tardar bastante) termina. Asimismo se evita que el usuario
crea que el proceso de carga no está llevandose a cabo correctamente o que
se haya paralzado por algún motivo.
Las ventanas de splash han sido un elemento que ha ido evolucionando con el tiempo,
pasando de ser meros cuadros de texto ASCII hasta complicadas ventanas con
animaciones multimedia. En este artículo se pretende explicar la manera de realizar una
pantalla de splash vistosa en Java, como por ejemplo, la mostrada en la Figura 1.
Página 2
Como realizar una Ventana de Splash
Como se puede comprobar esta ventana posee varias propiedades interesantes, quizás
la más destacable es emular una ventana transparente (cosa que con los paquetes
estandar de Java no es posible).
Página 3
Como realizar una Ventana de Splash
Página 4
Como realizar una Ventana de Splash
La ventana de Splash está formada por los elementos que se detallan a continuación:
1. Etiquetas: Como se verá más adelante es posible añadir cualquier
Component a la ventana. Estos en concreto son JLabels.
Página 5
Como realizar una Ventana de Splash
poder comprenderlo en su totalidad, así como ver lso comentarios en linea del mismo.
Página 6
Como realizar una Ventana de Splash
Como se ha visto con la correcta combinación de los distintos elementos en las capas
del jLayeredPane podemos conseguir el efecto de transparencia deseado.
Página 7
Como realizar una Ventana de Splash
representado en el panel.
El delay (retraso) indica el tiempo (en milisegundos) que se paralizará el código cuando
se haga un incremento en la barra de progreso. Este retraso, que puede ser 0 es bastante
útil ya que, como se verá más adelante, el thread intentará paralizarse durante este
tiempo, permitiendo con ello que otros threads (que pueden estar cargando otras clases)
pasen a ejecutarse. Por eso su uso es muy recomendable, incluso si vale 0, ya que el
thread se intentará parar y cederá el paso a cualquier otro que esté intentando ser
ejecutado.
Página 8
Como realizar una Ventana de Splash
El constructor aunque largo no hace más que inicializar algunos objetos Swing con los
valores que deben tener por defecto, así como cargar la imagen que debe utilizarse de
fondo (que puede contener transparencias), y cuya ruta ha sido mandada a través del
argumento image. Un detalle importante es que la Ventana de Splash tomará las
dimensiones exactas de la imagen de fondo, y dicho tamaño será el que se le ordene
capturar al backgroundPanel. Además la ventana aparecerá centrada en la pantalla.
Comentar por último con respecto al constructor que la variable que se le pasa
transparent indica si se desea que la ventana utilice el efecto de transparencia. En caso
de que la imagen que utilicemos de fondo no tenga transparencias (sea opaca
completamente) es recomendable indicar que no se quieren usar, ya que se ahorraran
algunos recursos (no se creará el objeto backgroundPanel) y aumentará la velocidad de
carga.
Página 9
Como realizar una Ventana de Splash
Página 10
Como realizar una Ventana de Splash
Este conjunto de métodos permiten controlar el aspecto del texto de progreso que
usualmente se encuentra encima de la barra de progreso. Los métodos más importantes
son: setProgressTextBounds() (para fijar la posición y tamaño de la etiqueta) y
setProgressText() (que nos permite cambiar el texto que se visualiza). Al igual que
pasaba con la barra de progreso existe un método (getProgressTextLabel()) que nos
devuelve la etiqueta por si necesitamos cambiar alguna propiedad que no esté accesible a
través de la clase SplashWindow.
Este método es usado para actualizar el fondo de la ventana (teóricamente para cuando
el proceso de carga es verdaderamente lento). Sin embargo su uso no es evidente ya que
requiere ocultar primero la ventana, pues si no se hiciera así la captura se realizaría sobre
la misma ventana de splash y evidentemente el fondo no cambiaría. Se puede cambiar
este método para que automáticamente haga invisible la ventana de splash, capture el
fondo y por último la restaure, pero este proceso provoca un parpadeo incómodo.
Por último el método close() oculta la ventana de splash y libera los recursos de la
misma.
Página 11
Como realizar una Ventana de Splash
El siguiente paso es fijar las propiedades del texto de progreso: Su posición, una fuente
pequeña, color amarillo y visible (por defecto también es invisible).
Página 12
Como realizar una Ventana de Splash
En esta porción de código se crean 3 etiquetas distintas, con tamaños de letra, textos y
colores disintos y se incluyen en la ventana de splash, con lo que creamos un titulo, un
subtitulo y una nota de copyright.
A continuación se añade un botón con una pequeña "X" que simula un botón de cierre
de la ventana. Para que responda cerrando la ventana se añade un nuevo
ActionListener que llama al método closeActionPerformed() que como se verá más
adelante únicamente cierra la aplicación.
// wait
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
// hide
splash.close();
// bye
System.exit(0);
Página 13
Como realizar una Ventana de Splash
Este es el código que se ejecuta cuando el usuario pincha en el botón de cerrar. Como
se puede comprobar el código solo ejecuta un close() de la ventana de Splash, con lo
que la aplicación seguirá cargando perfectamente, aunque sin mostrar la ventana.
...
splash.setProgressText("Cargando la ventana 1...");
Ventana1 v1 = new Ventana1(); // Se carga la clase Ventana1
v1 = null;
splash.incrementProgressBarValue(1);
splash.setProgressText("Cargando la ventana 2...");
Ventana1 v2 = new Ventana2(); // Se carga la clase Ventana2
v2 = null;
splash.incrementProgressBarValue(1);
splash.setProgressText("Cargando la ventana 3...");
Ventana1 v3 = new Ventana3(); // Se carga la clase Ventana3
v3 = null;
splash.incrementProgressBarValue(1);
...
Página 14
Como realizar una Ventana de Splash
Un aspecto que hay que tener en cuenta es que si una clase referencia directamente a
otra, hay que establecer un orden cuidadoso para que el proceso de carga resulte más
"homogeneo", ya que la máquina virtual de Java si tiene que cargar una clase y dentro del
constructor se ordena que cree un objeto de otra que aún no está cargada, como es
lógico la cargará. Por ejemplo, supongamos que tenemos 3 clases: VentanaPadre,
VentanaHijo1 y VentanaHijo2, donde la primera en su constructor crea una instacia de
cada una de las hijas. Si suponemos que cargar cada clase supone un segundo de tiempo
(¡¡¡esperemos que no!!! :-P), si utilizamos un código como el que sigue (pseudocódigo):
Cargar_VentanaPadre();
Cargar_VentanaHijo1();
Cargar_VentanaHijo2();
Cargar_VentanaHijo1();
Cargar_VentanaHijo2();
Cargar_VentanaPadre();
conseguirá que cada instrucción solo tarde 1 segundo (al cargar la ventana padre no las
otras dos están cargadas, con lo que no se perderá el tiempo en volverlas a cargar).
Evidentemente no solo tarda una aplicación en cargar por las clases que hay que traer
a memoria, sino por los datos que haya que leer de disco, imágenes que haya que cargar,
búsquedas de actualizaciones en internet, etc., con lo que estas acciones deben ser
combinandas con astucia durante el proceso de carga para que ésta se lleve a cabo de
formar uniforme y lo más rápidamente posible. Cada aplicación particular tiene sus
peculiaridades a la hora de la carga que deben ser solventadas por su programador.
Página 15
Como realizar una Ventana de Splash
Página 16
Como realizar una Ventana de Splash
Notas finales
Espero que este artículo y el código fuente que se ofrece con él te sea de utilidad. En
caso de querer hacer alguna corrección, apunte o comentario sobre el artículo o el código
fuente, por favor, no dudes en escribirme. En caso de que utilices mis clases por favor lee
la licencia GPL que acompaña al código y asegurate que no infringues ninguno de los
puntos que se presentan. También me gustaría que si utilizas mi código me escribas
reseñando en que aplicación lo haces. Muchas gracias. Zerjillo
Recursos y referencias
[1] Código fuente, ejemplos y documentación, SplashWindow v1.0.zip
Página 17
Como realizar una Ventana de Splash
Copyright (c) 2003, Sergio Alonso Burgos. Este documento puede ser distribuido solo bajo los
términos y condiciones de la licencia de Documentación de javaHispano v1.0 o posterior (la última
versión se encuentra en http://www.javahispano.org/licencias/).
Página 18