El visualizador de applets (appletviewer)
es una aplicación que permite ver en funcionamiento applets, sin necesidad de la
utilización de un navegador World-Wide-Web como HotJava, Microsoft Explorer
o Nescape. En adelante, se recurrirá muchas veces a él, ya que el objetivo de
este Tutorial es el lenguaje Java, y es la forma más sencilla y económica de poder ver
un applet en ejecución.
Applet
La definición más extendida de applet,
muy bien resumida por Patrick Naughton, indica que un applet es "una pequeña
aplicación accesible en un servidor Internet, que se transporta por la red, se instala
automáticamente y se ejecuta in situ como parte de un documento web". Claro que
así la definición establece el entorno (Internet, Web, etc.). En realidad, un applet es
una aplicación pretendidamente corta (nada impide que ocupe más de un gigabyte, a no ser
el pensamiento de que se va a transportar por la red y una mente sensata) basada en un
formato gráfico sin representación indepediente: es decir, se trata de un elemento a
embeber en otras aplicaciones; es un componente en su sentido estricto.
Un ejemplo en otro ámbito de cosas podría ser
el siguiente: Imagínese una empresa, que cansada de empezar siempre a codificar desde
cero, diseña un formulario con los datos básicos de una persona (nombre, dirección,
etc.). Tal formulario no es un diálogo por sí mismo, pero se podría integrar en
diálogos de clientes, proveedores, empleados, etc. El hecho de que se integre estática
(embebido en un ejecutable) o dinámicamente (intérpretes, DLLs, etc.) no afecta en
absoluto a la esencia de su comportamiento como componente con qué construir diálogos
con sentido autónomo.
Pues bien, así es un applet. Lo que ocurre es
que, dado que no existe una base adecuada para soportar aplicaciones industriales Java en
las que insertar estas miniaplicaciones (aunque todo se andará), los applets se han
construido mayoritariamente, y con gran acierto comercial (parece), como pequeñas
aplicaciones interactivas, con movimiento, luces y sonido... en Internet.
Llamadas a Applets con appletviewer
Al ser un applet una mínima aplicación Java
diseñada para ejecutarse en un navegador Web, no necesita por tanto preocuparse por un
método main() ni en dónde se realizan las llamadas. El applet asume que el
código se está ejecutando desde dentro de un navegador. El appletviewer se
asemeja al mínimo navegador. Espera como argumento el nombre del fichero html a
cargar, no se le puede pasar directamente un programa Java. Este fichero html debe
contener una marca que especifica el código que cargará el appletviewer:
<HTML>
<APPLET CODE=HolaMundo.class WIDTH=300 HEIGHT=100>
</APPLET>
</HTML>
El appletviewer creará un espacio de
navegación, incluyendo un área gráfica, donde se ejecutará el applet, entonces
llamará a la clase applet apropiada. En el ejemplo anterior, el appletviewer cargará una
clase de nombre HolaMundo y le permitirá trabajar en su espacio gráfico.
Arquitectura de appletviewer
El Appletviewer representa el mínimo interfaz
de navegación. En la figura se muestran los pasos que seguiría appletviewer para
presentar el resultado de la ejecución del código de la clase del ejemplo.
Esta es una visión simplificada del
appletviewer. La función principal de esta aplicación es proporcionar al usuario un
objeto de tipo Graphics sobre el que dibujar, y varias funciones para facilitar el
uso del objeto Graphics.
Cuando un applet se carga en el appletviewer,
comienza su ciclo de vida, que pasaría por las siguientes fases:
- Se crea una instancia de la clase que controla el applet. En el ejemplo de la figura
anterior, sería la clase HolaMundo
- El applet se incializa
- El applet comienza a ejecutarse
- El applet empieza a recibir llamadas. Primero recibe una llamada init
(inicializar), seguida de un mensaje start (empezar) y paint (pintar). Estas
llamadas pueden ser recibidas asíncronamente.
Métodos de appletviewer
A continuación se utiliza como excusa la
función asociada al appletviewer de los siguientes métodos para intentar un acercamiento
a su presentación, aunque a lo largo de secciones posteriores, se harán de nuevo
múltiples referencias a ellos, porque también son los métodos propios de la clase Applet,
que se utilizará en muchos ejemplos.
init()
El método init() se llama cada vez que
el appletviewer carga por primera vez la clase. Si el applet llamado no lo sobrecarga, init()
no hace nada. Fundamentalmente en este método se debe fijar el tamaño del applet, aunque
en el caso de Netscape el tamaño que vale es el que se indique en la línea del fichero html
que cargue el applet. También se deben realizar en este método las cargas de imágenes y
sonidos necesarios para la ejecución del applet. Y, por supuesto, la asignación de
valores a las variables globales a la clase que se utilicen. En el caso de los applet,
este método únicamente es llamado por el sistema al cargar el applet.
start()
start() es la llamada para arrancar el
applet cada vez que es visitado. La clase Applet no hace nada en este método. Las
clases derivadas deben sobrecargarlo para comenzar la animación, el sonido, etc. Esta
función es llamada automáticamente cada vez que la zona de visualización en que está
ubicado el applet se expone a la visión, a fin de optimizar en uso de los recursos del
sistema y no ejecutar algo que no puede ser apreciado (aunque es potestad del programador
el poder variar este comportamiento impuesto por defecto, y hacer que un applet siga
activo incluso cuando se encuentre fuera del área de visión).
Esto es, imagínese la carga de un applet en un
navegador minimizado; el sistema llamará al método init(), pero no a start(),
que sí será llamado cuando se restaure el navegador a un tamaño que permita ver el
applet. Naturalmente, start() se puede ejecutar varias veces: la primera tras init()
y las siguientes (porque init() se ejecuta solamente una vez) tras haber aplicado
al applet el método stop().
stop()
stop() es la llamada para detener la
ejecución del applet. Se llama cuando el applet desaparece de la pantalla. La clase Applet
tampoco hace nada en este método, que debería ser sobrecargado por las clases derivadas
para detener la animación, el sonido, etc. Este método es llamado cuando el navegador no
incluye en su campo de visión al applet; por ejemplo, cuando abandona la página en que
está insertado, de forma que el programador puede paralizar los threads que no resulten
necesarios respecto de un applet no visible, y luego recuperar su actividad mediante el
método start().
destroy()
El método destroy() se llama cuando ya
no se va a utilizar más el applet, cuando se necesita que sean liberados todos los
recursos dispuestos por el applet, por ejemplo, cuando se cierra el navegador. La clase Applet
no hace nada en este método. Las clases derivadas deberían sobrecargarlo para hacer una
limpieza final. Los applet multithread deberían utilizar destroy() para detener
los threads que quedasen activos.
El appletviewer también contiene la clase Component
(componente), que usa dos métodos para ayudar al applet a escribir en el espacio gráfico
que el appletviewer le proporciona para su ejecución.
paint()
Es la función llamada cada vez que el área de
dibujo del applet necesita ser refrescada. La clase Applet simplemente dibuja un
rectángulo gris en el área, es la clase derivada, obviamente, la que debería
sobrecargar este método para representar algo inteligente en la pantalla. Cada vez que la
zona del applet es cubierta por otra ventana, se desplaza el applet fuera de la visión o
el applet cambia de posición debido a un redimensionamiento del navegador, el sistema
llama automáticamente a este método, pasando como argumento un objeto de tipo Graphics
que delimita la zona a ser pintada; en realidad se pasa una referencia al contexto
gráfico en uso, y que representa la ventana del applet en la página web.
update()
Esta es la función que realmente se llama
cuando se necesita una actualización de la pantalla. La clase Applet simplemente
limpia el área y llama al método paint(). Esta funcionalidad es suficiente para
la mayoría de los casos; aunque, de cualquier forma, las clases derivadas pueden
sustituir esta funcionalidad para sus propósitos especiales. Es decir, en las situaciones
detalladas anteriormente que dañan la zona de exposición del applet, el sistema llama al
método paint(), pero en realidad la llamada se realiza al método update(),
cuyo comportamiento establecido en la clase Component es llamar al método paint(),
tras haber rellenado la zona del applet con su color de fondo por defecto. Pudiera parecer
así que se trata de un método de efecto neutro, pero si la función paint()
cambiara el color del fondo, se podría percibir un flick de cambio de colores nada
agradable. Por tanto, habrá que cuidarse por lo común, de eliminar este efecto de limpia
primero, sobrecargando el método update(), para que llame únicamente a paint().
Otra solución sería insertar el código de pintado en una sobrecarga del método update()
y escribir un método paint() que sólo llame a update(). La última
solución pasaría por usar el mismo método setBackground( Color ), en el método init()
para así evitar el efecto visual sin tener que sobrecargar el método update().
Estas son las mismas razones que aconsejan usar el método resize() inserto en init(),
para evitar el mismo desagradable efecto.
repaint()
Llamando a este método se podrá forzar la
actualización del applet, la llamada a update(). Pero hay que tener cuidado, AWT
posee cierta inteligencia (combinación casi siempre nefasta), de forma que si se llama a update()
mediante repaint() con una frecuencia muy corta, AWT ignorará las llamadas a update()
que estime oportuno, pues considera a esta función un bien escaso.
La figura anterior muestra el ciclo habitual en
que se mueve la ejecución, visualización y destrucción de los applets.
Sinopsis
La llamada a appletviewer es de la forma:
appletviewer [-debug] urls...
El appletviewer toma como parámetro de
ejecución, o bien el nombre del un fichero html conteniendo el tag (marca) <APPLET>, o
bien un URL hacia un fichero HTML que contenga esa marca. Si el fichero html no
contiene un tag <APPLET> válido, el appletviewer no hará nada. El appletviewer no
muestra otras marcas html.
La única opción válida que admite la llamada
a appletviewer es -debug, que arranca el applet en el depurador de Java, jdb. Para
poder ver el código fuente en el depurador, se debe compilar ese fichero fuente .java con
la opción -g.
Ejemplo de uso
En el ejemplo de llamada al appletviewer que se
muestra a continuación, se consigue que se ejecute el applet que se creará en la
sección siguiente y que se lanzará desde un fichero html del mismo nombre que nuestro
fichero de código fuente Java.
%appletviewer HolaMundo.html
Esta llamada lanzaría la ejecución de HolaMundo.class en el appletviewer,
abriéndose en pantalla la ventana siguiente:
Funciones de menú de appletviewer
El appletviewer tiene un único menú, tal como
se muestra en la imagen siguiente, y que se explica a continuación en sus opciones más
importantes, ya que se usará a menudo cuando se vaya avanzando en conocimientos acerca de
Java.
La función Restart llama al método stop()
y seguidamente llama de nuevo a start(), que es el método que ha lanzado
inicialmente la ejecución del applet. Se puede utilizar Restart para simular el
movimiento entre páginas en un documento html, de tal modo que se pueden
reproducir las secuencias de parada y arranque del applet que se producirían al
desplazarse a otra página y volver a la que contiene el applet.
La función Reload llama al método stop()
y luego al método destroy() en el applet actual. A continuación carga una nueva
copia del applet y la arranca llamando al método start().
La función Stop detiene la ejecución
del applet. Es como si se hubiese lanzado el appletviewer con el applet cargado, pero sin
ejcutarse. Llama al método stop().
La función Save permite grabar la
representación actual del applet, de forma que posteriormente se puede leer el fichero en
que se salva y recuperar el estado en que se encontraban los objetos que componían el
applet. Esto se verá en detalle al tratar la serialización de objetos en Java.
La función Start llama al método start(),
de forma que si el applet ya estaba en ejecución, no hace nada, pero si estaba detenido
con stop(), lo pone de nuevo en marcha.
La función Clone crea una copia del
applet actual en una ventana de appletviewer nueva. En realidad es un appletviewer
idéntico con el mismo URL.
La función Tag muestra en una ventana
hija del appletviewer el código html cargado para su ejecución. Es similar a la función
View Source que figura en la mayoría de los navegadores, Netscape y HotJava
incluidos.
La función Info lee los comentarios de
documentación contenidos en el fichero html y muestra la información de los parámetros
(si la hay).
El appletviewer tiene las funciones básicas de
presentación de un navegador y la función Properties (propiedades de la red)
permite cambiar o establecer el modo de seguridad o fijar los servidores de proxy o
firewall.
La función Close llama al método destroy()
de la ventana actual del appletviewer, teminando su ejecución.
La función Quit llama al método destroy()
de cada una de las copias del appletviewer que se encuentren lanzadas, concluyendo la
ejecución de todas ellas y terminando entonces el appletviewer.
|