Está en la página 1de 14

Tema 10: Applets e Internet

1. Fundamentos de los applets
Un applet es un programa Java que se ejecuta en el navegador web, utilizando todos sus recursos como entorno de trabajo. Por ejemplo, la página en la que se carga el applet hace de entorno gráfico en el que se van a dibujar los comandos gráficos. En términos generales, la diferencia básica entre una aplicación Java y un applet es que las primeras son programas destinados a ser ejecutados en la máquina sin intermediación del navegador. Para ello deben incluir un método main().Por ejemplo, el típico “Hola Mundo”, el programa más sencillo que se nos pueda ocurrir, tendría el siguiente aspecto visto como una aplicación public class Hola { public static void main(String argv[]) { System.out.println(“Hola!”); } } Sin embargo un applet equivalente tendría el siguiente aspecto: import java.applet.*; import java.awt.*; public class Hola extends Applet { public static void paint(Graphics g) { g.drawString(“Hola!”, 20, 10); } } El applet pinta la cadena “Hola!” en una posición concreta del espacio reservado por el navegador. Además las dos primeras líneas (import) habilitan el uso de los paquetes java.applet y java.awt. El primero de ellos contiene la clase Applet y algunas otras como AppletContext, AppletStub y AudioClip, mientras que el segundo contiene las clases del AWT (Abstract Window Toolkit) destinadas a la programación gráfica. 1.1. Implementación básica de un applet Para construir un applet debemos implementar una clase que especialice la clase Java Applet. La clase Applet permite la definición de pequeñas aplicaciones que van a ser ejecutadas dentro de un programa, en nuestro caso un navegador. Esta clase proporciona un conjunto de métodos de utilidad que veremos más adelante, y que nos van a permitir, por ejemplo, cargar una imagen desde una URL, reproducir un sonido o abrir una nueva página en el navegador.

Lo más usual es definir únicamente init() y dejar que el resto de métodos ejecuten el código de la clase padre.1 proporciona los denominados listeners. Cada objeto escucha únicamente los eventos del tipo correspondiente a su clase y que además se han ejecutado sobre el componente al que están asociados. Applets como componentes AWT El AWT (Abstract Window Toolkit) es. para eventos del ratón como pulsaciones.. En realidad. Si un usuario sale de la página en la que se ha cargado el applet y vuelve a ella. windowListener. el navegador llama a un método del ciclo de vida del applet. para acciones semánticas como la pulsación de un botón. para que éste realice las tareas correspondientes a cada caso. En nuestro caso. botones. por ejemplo: actionListener. que permite agrupar los componentes que se añaden en él y tratar como uno todos ellos cuando se insertan en un container superior (el applet. el applet desaparecerá de la vista del usuario. para eventos relacionados con las ventanas. En otros momentos. Esto sucede cuando el usuario abandona la página con el applet. etc. bien porque éste ha cargado otra página. El AWT se basa en dos conceptos fundamentales: componentes y eventos. por defecto. start(): método al que llama el navegador cuando comienza a ejecutar el applet. los eventos se producen como consecuencia de las acciones del usuario sobre los componentes y deben ser tratados por el programa. en la clase Applet. por ejemplo). el AWT 1. como vimos en el tema anterior.) Un objeto container es un tipo especial de componente no visible. Para ello. el applet no se reinicia. etiquetas. y ésta es subclase de Container (la jerarquía de clases de AWT se muestra en el apartado . un conjunto de clases de Java que permiten construir y manejar interfaces de usuario. que forman la interfaz de usuario. A la hora de implementar un applet se deberán redefinir únicamente aquellos métodos necesarios. 2 . !" !" !" Todos los métodos del ciclo de vida están definidos. el entorno de ejecución será un navegador. Una interfaz de usuario se construye añadiendo con el método add los componentes al applet. sino que vuelve a llamarse a este método. éste debe realizar ciertas tareas de inicialización. Estas clases son parte integral del lenguaje y proporcionan. En cualquier de estos casos. Los componentes son los elementos como menús. campos de texto. o minimiza la aplicación. o añadiéndolos a paneles (objetos de la clase Panel) que después se añadirán a su vez al applet. Hay distintas clases de listeners. destroy(): método al que llama el navegador justo antes de descargar el applet. stop(): método al que llama el navegador cuando se detiene el applet. mouseListener. por lo tanto. Applets e Internet Ciclo de vida de un applet Cuando el navegador carga un applet por primera vez.. etc.Tema 10. o porque ha minimizado la página actual. En este método debe incluirse todo el código de inicialización del mismo. Los métodos son los siguientes: !" init(): método al que llama el navegador cuando se carga o recarga el applet. objetos que se asocian a componentes y que manejan los eventos específicos de su clase. una garantía de que la aplicación desarrollada va a poder ejecutarse en cualquier entorno que soporte el lenguaje Java. la clase Applet es una subclase de Panel. como cerrar o minimizar ventana. Por otra parte.

cuando se produce un evento sobre un componente sólo escuchan ese evento aquellos manejadores que están asociados al componente y que implementan métodos relacionados con el evento producido. Para ello.event. } } } En el applet se define el componente botonBeep de tipo botón y se le asocia un manejador de eventos de la clase BotonBeepListener.3 > set CLASSPATH = %JAVA_HOME%\lib. add(botonBeep).3. En este caso.. public void init() { toolkit = this.applet.getToolkit().beep().awt.*.Programación para la Gestión Un primer ejemplo de applet Ejemplo de un sencillo applet que muestra un botón y asocia una acción al evento de pulsar el botón.java 3 . } class BotonBeepListener implements ActionListener { public void actionPerformed(ActionEvent event) { toolkit. Esta clase es una clase interna (inner class) de Beep e implementa la interfaz ActionListener. Debes inicializar las variables del entorno necesarias para que el compilador y el intérprete de Java funcionen correctamente: > set JAVA_HOME = C:\jdk1. Supongamos que tienes el JSDK 1. Como ya hemos comentado. Para comprobar el funcionamiento del applet.addActionListener(new BotonBeepListener()). botonBeep. debes primero compilarlo.awt. la acción es ejecutar un beep. En este caso.1. public class Beep extends Applet { Toolkit toolkit. la interfaz ActionListener sólo tiene un único método. que escucha el evento 'pulsación del botón'. Button botonBeep = new Button("Beep"). en el directorio C:\jdk1. import java.*.3 de Sun. > set PATH = %PATH%:%JAVA_HOME%\bin Ahora ya puedes compilar el programa > javac Beep. que se ejecuta cuando se pulsa el botón al que se ha asociado el manejador. debes tener instalado algún compilador Java.java Sencillo applet que muestra un botón y ejecuta un eep al pulsarlo import java. import java. Listado 10.*. Beep. que es actionPerformed().

html Verás un botón que ejecutará un sonido cuando lo pulses. El siguiente fichero HTML se encarga de realizar la carga del applet: Listado 10.Tema 10. > appletviewer Beep. Sintaxis La sintaxis completa de esta etiqueta es la siguiente: <APPLET [CODEBASE = URL] [CODE = fichero con la clase principal] WIDTH = anchura HEIGHT = altura [ALT = texto alternativo] [NAME = nombre del applet] [ALIGN = alineación en la página] [VSPACE = espacio vertical] [HSPACE = espacio vertical] > [<PARAM NAME = nombre del parámetro 1 VALUE = valor del parámetro 1 >] [<PARAM NAME = nombre del parámetro 2 VALUE = valor del parámetro 2 >] . [Texto HTML alternativo] </APPLET> Descripción de los elementos El significado de cada uno de estos elementos se comenta en la siguiente tabla: 4 .2.class en el navegador <html> <applet code=Beep..class width=100 height=100> </applet> </html> También es posible comprobar el funcionamiento de un applet utilizando el programa appletviewer proporcionado en la distribución del JSDK de Sun.html Documento HTML que carga el applet Beep.. Applets e Internet y cargarlo en un navegador.2 El tag APPLET Ya hemos visto en el ejemplo anterior que la etiqueta que se emplea en la página HTML para cargar el applet es <APPLET>. 1. Beep.

bottom. Nombre que identifica el applet. absbottom. Ya se ha explicado en detalle. Espacio horizontal en pixels que el navegador debe reservar entre el texto previo y el applet. Se usa para que más de una applet en la misma página puedan comunicarse entre ellos. CODE = fichero . Elemento idéntico al atributo del tag IMG de HTML.Programación para la Gestión Elemento CODEBASE = URL Descripción URL base del applet. En el caso de que este fichero deba importar otras clases adicionales implementadas por nosotros. Puede tomar los siguientes valores: left.class) y ficheros HTML en directorios distintos. podemos en el servidor organizar applets (ficheros . Elemento idéntico al atributo del tag IMG de HTML.class WIDTH = pixels HEIGHT = pixels ALT = textoAlternativo NAME = nombre ALIGN = alineación VSPACE = pixels HSPACE = pixels PARAM = identificador del parámetro VALUE = valor Texto alternativo Texto que aparecerá en aquellos navegadores que no entiendan el tag APPLET. Elemento idéntico al atributo del tag IMG de HTML. Nombre del fichero . right. El elemento CODEBASE permite que el applet se encuentre en un directorio (incluso en una URL) distinto del directorio en el que se encuentra el fichero HTML desde el que se carga. pero es incapaz de cargar el applet. el navegador las cargará de forma automática realizando una petición HTTP por cada una de ellas. se añade a esta URL por defecto. Si se especifica una dirección relativa. el URL del directorio que contiene la página desde la que se carga el applet. baseline.class que implementa el applet. esto es. Se utiliza para el paso de parámetros desde la página HTML hasta el applet. Para mejorar el rendimiento de estos casos. De esta forma. la 5 . Define la alineación del applet. texttop. La URL completa del fichero se obtiene añadiendo este nombre al CODEBASE. absmiddle. middle. Texto que debe mostrar el navegador si entiende la etiqueta APPLET. el fichero con el nombre de la clase que es subclase de Applet. top. Por defecto. El atributo CODE debe contener el nombre del fichero principal que implementa el applet. Esto introduce un retardo importante en la carga del applet. Ancho en pixels de la zona del navegador reservada para mostrar el applet Alto en pixels de la zona del navegador reservada para mostrar el applet. Espacio vertical en pixels que el navegador debe reservar entre el texto previo y el applet.

Normalmente los applets "profesionales" tienen un gran número de parámetros que permiten una gran flexibilidad en su uso. Todos los valores de los parámetros se pasan como strings y es el applet debe convertirlos en el tipo adecuado.com Para cargar el applet.class que es subclase de Applet. que comprimen un conjunto de ficheros CLASS en un único archivo. revisemos el applet Billboard.jars.com"> <PARAM NAME=regcode value=""> <PARAM NAME=bgcolor value="ffffff"> <PARAM NAME=image_number value="4"> <PARAM NAME=image_align value="center"> <PARAM NAME=image_valign value="center"> <PARAM <PARAM <PARAM <PARAM 6 NAME=image1 NAME=image2 NAME=image3 NAME=image4 value="dev. como son el color de fondo. Cuando escribamos un applet que use parámetros debemos documentar perfectamente qué parametros acepta y cuál es la sintaxis esperada para cada uno de los parámetros. para cargar el fichero JAR menu.jar. hay que especificar los valores de todos los parámetros necesarios para configurarlo.com y www.gif"> .gif"> value="jdj.class ARCHIVE = menu WIDTH = 100 HEGHT = 400> Parámetros Otro elemento muy importante son las etiquetas PARAM.1 del JDK de Java introdujo los archivos JAR.tripod.japplets. NOTA: Sitios web donde buscar diversos applets (jars. tocows) www.class" WIDTH=234 HEIGHT=60> <PARAM NAME=info value="Applet by Gokhan Dagli. Applets e Internet versión 1. el fuente por defecto del texto o todas las opciones de menú junto con la URL a la que apuntan. Por ejemplo. Listado 10. gamelan. Se trata de uno de los muchísimos applets "profesionales" de dominio público desarrollados para mostrar banners en páginas HTML. haciendo posible que el applet funcione en múltiples situaciones sin necesidad de reescribirlo ni recompilarlo. Constituyen la forma de pasar parámetros desde la página HTML hasta el applet.javaboutique. se debería escribir: <APPLET CODEBASE = applets/ CODE = menu. basados en el formato ZIP.Tema 10.gif"> value="jw. Con la etiqueta ARCHIVE se carga el fichero JAR en el navegador. Por ejemplo.gif"> value="jr.3: Ejemplo de etiqueta APPLET para configurar el applet billboard <APPLET CODE="billboard. que está situado en el directorio applets y tiene una clase menu.

tripod.html"> <PARAM NAME=link2 value="http://japplets.tripod. “step” y “step_period” indican respectivamente el retardo entre imágenes consecutivas. AppletStub y AudioClip. 2. Mostrar información en la línea de status del navegador. el paso de scroll de píxel y la velocidad del scroll. Abrir una página en el navegador. right) y vertical (top. Las interfaces son implementadas por el propio navegador y constituyen la forma de pasar información propia del navegador hacia el applet. Los parámetros “delay_period”.8"> NAME=delay_period value="3000"> NAME=step value="4"> NAME=step_period value="40"> </APPLET> El primer grupo de parámetros hacen referencia a información general. Entre las funciones que vamos a poder realizar utilizando estos métodos se encuentran las siguientes: !" !" !" !" !" !" Obtener la URL donde se encuentra el documento que ha cargado el applet.6. al código de registro y al color de background. El segundo grupo se refiere al número de imágenes a manejar en el banner y a su alineamiento horizontal (left. center. Si “effects”=”custom” se pueden indicar los efectos indicados por enteros del 1 al 8. bottom).tripod. Métodos del paquete java.html"> <PARAM NAME=link4 value="http://japplets. El parámetro “target_frame” indica en que frame se ejecuta el applet.html"> <PARAM <PARAM <PARAM <PARAM <PARAM <PARAM NAME=target_frame value="_self"> NAME=effects value="respectively"> NAME=param name=custom_effects value="5. A continuación se capturan los links asociados a cada imagen.Programación para la Gestión <PARAM NAME=link1 value="http://japplets. Ejecutar un clip de sonido. Leer los valores los parámetros de la etiqueta APPLET del documento HTML.com/samplelink.com/samplelink. El siguiente grupo hace referencia a las 4 imágenes utilizadas.tripod.com/samplelink.7.applet El paquete java.applet está constituido por la clase Applet y las interfaces AppletContext. Obtener una imagen desde una determinada URL. 7 .com/samplelink.html"> <PARAM NAME=link3 value="http://japplets. center. El parámetro “effects” puede valer “random” o “custom”.

gif situada en el subdirectorio image de esa URL. Para utilizar un método de la interfaz AppletContext no tenemos más que obtener el appletContext asociado a un applet con el método getAppletContext().1 Métodos invocados desde el applet La siguiente tabla enumera todos los métodos que podemos utilizar desde un applet. "image/image1. Clase Applet public public public public public public public public public public public public public URL getDocumentBase() URL getCodeBase() String getParameter(String nombre) AppletContext getAppletContext() void resize(int ancho. como es que el usuario cambie la página actual o que se minimize la ventana en la que se está ejecutando. Applets e Internet También se encuentran en la clase Applet un conjunto de métodos invocados desde el navegador cuando se produce un evento que puede afectar a la ejecución del applet. String target) void showStatus(String status) URL del documento y del código base Los métodos getDocumentBase() y getCodeBase() devuelven la URL del documento HTML que ha cargado el applet y la URL base desde la que se ha cargado el applet. String nombre) String getAppletInfo() void play(URL url) void play(URL url. Son los métodos init(). int alto) void showStatus(String msg) Image getImage(URL url) final static AudioClip newAudioClip(URL url) AudioClip getAudioClip(URL url) AudioClip getAudioClip(URL url. String nombre) Interface AppletContext AudioClip getAudioClip(URL url) Image getImage(URL url) Applet getApplet(String nombre) Enumeration getApplets() void showDocument(URL url) public void showDocument(URL url. start(). Obtención de parámetros de la etiqueta APPLET Recordemos que la sintaxis de la etiqueta APPLET para especificar un parámetro para el applet era: <PARAM NAME = nombre VALUE = valor> 8 . Son métodos de la propia clase Applet o de la interfaz AppletContext. Por ejemplo: URL base = getDocumentBase().gif"). 2. Image imagen = getImage(base. De esta forma se evita dar una URL absoluta y se independiza la implementación del applet de su ubicación en el servidor. En el ejemplo anterior se obtiene la URL donde está instalado el documento HTML desde el que se ha cargado el applet y a continuación se obtiene la imagen image1. stop() y destroy().Tema 10.

4 DibujaImagen. supongamos un applet que permite configurar su color de fondo con una instrucción como: <PARAM NAME = "COLOR" VALUE = "00FF44"> Para leer el valor de este parámetro en el applet se debe implementar el siguiente código: String colorStr = getParameter("COLOR").*. Color. public class DibujaImagen extends Applet { 9 . utilizando getDocumentBase() para obtener la URL: Image img = getImage(getDocumentBase(). URL.ParseInt(colorStr.awt. por lo que cada nuevo mensaje borra el anterior. else Color color = new Color(Integer. Imágenes desde URLs Los métodos getImage(URL url) y getImage(URL url. Por ejemplo. El siguiente applet crea un Canvas en el que se dibuja una imagen que se ha cargado del directorio en el que se encuentra la página HTML: Listado 10.java Applet que carga la imagen "img1. Mensajes en la línea de estado del navegador El método showStatus(String msg) permite mostrar un mensaje en la línea de estado del navegador.white). Esta línea no tiene posibilidad de scroll.gif" que debe existir en el mismo directorio en que se encuentra el fichero HTML que lo carga import java. import java. normalmente se convertirá en un objeto de otra clase (int.) utilizando algún constructor de Java. o algún subdirectorio.Applet.16)). if (colorStr == NULL) Color color = new Color(Color.applet. "images/img1. La segunda forma de llamar al método suele ser la más usada desde los applets. Normalmente será la misma URL donde se encuentra el documento HTML que ha cargado el applet. Después de obtenido el string. El ejemplo anterior utiliza la línea de estado para mostrar una URL absoluta.Programación para la Gestión El método getParameter(string nombre) devuelve el string valor asociado al parámetro nombre en la etiqueta APPLET que ha cargado el applet.gif"). etc. En este caso. showStatus(getDocumentBase()+link). suponemos que el applet implementa un sistema de menús y que el método getLinkCurrentOption() devuelve el link asociado a la opción sobre la que se encuentra el ratón. Por ejemplo: String link = getLinkCurrentOption(). string nombre) sirven para obtener un objeto de la clase Image que se encuentra en una determinada URL.

gif"). Los sonidos deben ser de formato ".0. AreaDibujo region = new AreaDibujo(img.width. !" !" 10 . Applets e Internet public void init() { Image img = getImage(getDocumentBase(). la que coloca la imagen directamente en la posición (0. Si la imagen fuera más grande que el tamaño del canvas (que es el mismo que el del applet) aparecería recortada. } public void paint(Graphics g) { g.applet para cargar sonidos desde una URL y para reproducirlos.drawImage(img. reproducirlo de forma continua o detener la reproducción.0.img = img. o una URL base y un nombre de fichero que se añade a la URL base.0) del canvas. Para reproducir un sonido desde una URL se utilizan los métodos play(URL url) y play(URL url. es posible escalar la imagen ajustándola al tamaño del canvas.au". int ancho.Tema 10. nombre). d. } } Existen también otras versiones del método drawImage de la clase Graphics en las que. loop() y stop(). Es bastante habitual que los programas de tratamiento y edición de sonidos ofrezcan la opción de convertir los sonidos al formato "."img1. String.height). Una vez que se tiene un objeto de tipo AudioClip es posible reproducir el sonido una vez. Ambos métodos devuelven un objeto de tipo AudioClip. un formato propio de Sun.alto). Son los siguientes: !" Para cargar un sonido desde una URL se utilizan los métodos getAudioClip(URL url) y getAudioClip(URL url. Existen métodos en el paquete java. } } class AreaDibujo extends Canvas { Image img. Nosotros hemos escogido la versión más sencilla. int alto) { this. public AreaDibujo(Image img.au". setSize(ancho. add(region). Al igual que con las imágenes. Dimension d = getSize(). Para ello se utilizan los métodos play(). String nombre). Reproduciendo sonidos Existen un conjunto de métodos que permiten cargar y reproducir sonidos en los applets. d.this). es posible pasar como parámetro una URL absoluta. por ejemplo.

loop(). El primer método lo hace en una nueva página. las funciones ya comentadas de los applets para cargar imágenes o sonidos.au" y debe estar en el mismo directorio del fichero HTML que carga el applet. add(botonPlay).}}). se implementan obteniendo el AppletContext asociado al applet y llamando a los métodos proporcionados por esta interfaz. import java.java Applet que ejecuta un sonido import java. Listado 10.*.5 Sonido. De hecho.event. y el segundo permite especificar el destino del documento mediante los siguientes valores: !" !" !" !" "_blank": muestra el documento en una página nueva sin nombre "nombre": muestra el documento en una página nueva llamada "nombre" "_self": muestra el documento en la página y frame que contiene el applet "_parent": muestra el documento en la ventana del applet. Button botonStop = new Button("Stop").addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { train.}}). 11 . import java. public void init() { train = getAudioClip(getDocumentBase().applet.*. botonStop. public class Sonido extends Applet { AudioClip train. pero en el frame padre del frame en el que se encuentra el applet."train.au"). Estos métodos hacen que el navegador abra una URL.awt. Button botonPlay = new Button("Play"). El sonido se llama "train. se comporta igual que "_self".awt. botonPlay. Dos de los métodos exclusivos de la interfaz. son showDocument(URL url) y showDocument(URL url. add(botonStop). uno para reproducir de forma continua un sonido cargado y el otro para detenerlo.stop(). Si el frame en el que se encuentra el applet no tiene padre.Programación para la Gestión El siguiente ejemplo presenta un applet con dos botones. String target). } } Abriendo páginas nuevas en el navegador La interface AppletContext proporciona un conjunto de métodos que permiten acceder a funcionalidades del entorno en el que se está ejecutando el applet.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { train. no implementados en la clase Applet.*.

add(textField). AbrirURL listener = new AbrirURL(). textField = new TextField("Introduce la URL aquí"). Si el frame en el que se encuentra el applet es el frame de nivel superior. try { url = new URL(urlString). se comporta igual que "_self". textField.showDocument(url. public class DocumentoNuevo extends Applet { TextField textField. public void init() { appletContext = getAppletContext().awt.6 DocumentoNuevo.Tema 10.net.*. } if (url != null) appletContext. } } } Nótese el modo en que se comprueba que la URL es correcta.addActionListener(listener). java. También es interesante hacer notar que se asocia el mismo oyente del evento ActionEvent tanto al botón como al campo de texto. URL url = null. java.java Applet que prueba el funcionamiento del método showDocument import import import import java. java. botonURL.awt. AppletContext appletContext.addActionListener(listener). capturando la excepción MalformedURLException. Applets e Internet !" "_top": muestra el documento en la ventana del applet.*. } catch (MalformedURLException e) { showStatus("URL incorrecta: " + urlString).getText(). } class AbrirURL implements ActionListener { public void actionPerformed(ActionEvent event) { String urlString = textField. Como ejemplo listamos a continuación un applet que permite al usuario introducir una URL en un campo de texto y abre el documento en una nueva página cuando se pulsa ENTER o el botón.applet. add(botonURL). Button botonURL = new Button("Abrir URL"). 12 .event.*. pero en el frame de nivel superior.*. ya que se debe hacer lo mismo cuando se pulsa el botón o cuando se pulsa ENTER. Listado 10."página nueva").

envía una excepción del tipo SecurityException.Seguridad y restricciones de ejecución Un applet que ha sido descargado desde una determinada URL no puede hacer ninguna de las siguientes cosas: !" !" No puede cargar ni definir librerías nativas No puede leer ni escribir ficheros del computador en el que se encuentra el navegador que lo está ejecutando No puede establecer conexiones con otros computadores distintos del que originalmente ha servido el applet No puede lanzar ningún programa en el host que lo está ejecutando No puede leer ciertas propiedades del sistema Las ventanas que abre un applet deben ser distintas de las que abra una aplicación.Programación para la Gestión 2. !" !" !" !" Cada navegador tiene un objeto de la clase SecurityManager que es el encargado de implementar políticas de seguridad. Cuando un SecurityManager detecta una violación de la política.2. 13 .

Applets e Internet 14 .Tema 10.