Java - Conceptos básicos del applet

Un appletes un programa Java que se ejecuta en un navegador web. Un subprograma puede ser una aplicación Java completamente funcional porque tiene toda la API de Java a su disposición.

Existen algunas diferencias importantes entre un subprograma y una aplicación Java independiente, incluidas las siguientes:

  • Un subprograma es una clase Java que amplía la clase java.applet.Applet.

  • Un método main () no se invoca en un applet y una clase de applet no definirá main ().

  • Los applets están diseñados para integrarse en una página HTML.

  • Cuando un usuario ve una página HTML que contiene un subprograma, el código del subprograma se descarga en la máquina del usuario.

  • Se requiere una JVM para ver un subprograma. La JVM puede ser un complemento del navegador web o un entorno de ejecución independiente.

  • La JVM en la máquina del usuario crea una instancia de la clase de subprograma e invoca varios métodos durante la vida del subprograma.

  • Los applets tienen reglas de seguridad estrictas que son impuestas por el navegador web. La seguridad de un subprograma a menudo se conoce como seguridad de la caja de arena, comparando el subprograma con un niño que juega en una caja de arena con varias reglas que deben seguirse.

  • Otras clases que necesita el subprograma se pueden descargar en un solo archivo Java Archive (JAR).

Ciclo de vida de un applet

Cuatro métodos en la clase Applet le brindan el marco en el que construye cualquier applet serio:

  • init- Este método está diseñado para cualquier inicialización necesaria para su subprograma. Se llama después de que se hayan procesado las etiquetas param dentro de la etiqueta del subprograma.

  • start- Este método se llama automáticamente después de que el navegador llama al método init. También se llama cuando el usuario vuelve a la página que contiene el subprograma después de haber ido a otras páginas.

  • stop- Este método se llama automáticamente cuando el usuario sale de la página en la que se encuentra el subprograma. Por lo tanto, se puede llamar repetidamente en el mismo subprograma.

  • destroy- Este método solo se llama cuando el navegador se apaga normalmente. Debido a que los subprogramas están destinados a vivir en una página HTML, normalmente no debe dejar recursos después de que un usuario abandona la página que contiene el subprograma.

  • paint- Se invoca inmediatamente después del método start (), y también cada vez que el subprograma necesita volver a pintarse en el navegador. El método paint () en realidad se hereda de java.awt.

Un subprograma "Hola, mundo"

A continuación se muestra un subprograma simple llamado HelloWorldApplet.java:

import java.applet.*;
import java.awt.*;

public class HelloWorldApplet extends Applet {
   public void paint (Graphics g) {
      g.drawString ("Hello World", 25, 50);
   }
}

Estas declaraciones de importación llevan las clases al ámbito de nuestra clase de subprograma:

  • java.applet.Applet
  • java.awt.Graphics

Sin esas declaraciones de importación, el compilador de Java no reconocería las clases Applet y Graphics, a las que se refiere la clase applet.

La clase de applet

Cada applet es una extensión de la clase java.applet.Applet . La clase Applet base proporciona métodos que una clase Applet derivada puede llamar para obtener información y servicios del contexto del navegador.

Estos incluyen métodos que hacen lo siguiente:

  • Obtener parámetros de subprograma
  • Obtenga la ubicación de red del archivo HTML que contiene el subprograma
  • Obtener la ubicación de red del directorio de clases del subprograma
  • Imprime un mensaje de estado en el navegador
  • Obtener una imagen
  • Obtener un clip de audio
  • Reproducir un clip de audio
  • Cambiar el tamaño del subprograma

Además, la clase Applet proporciona una interfaz mediante la cual el visor o navegador obtiene información sobre el applet y controla su ejecución. El espectador puede ...

  • Solicitar información sobre el autor, la versión y los derechos de autor del subprograma
  • Solicite una descripción de los parámetros que reconoce el applet
  • Inicializar el subprograma
  • Destruye el applet
  • Iniciar la ejecución del applet
  • Detén la ejecución del applet

La clase Applet proporciona implementaciones predeterminadas de cada uno de estos métodos. Esas implementaciones se pueden anular según sea necesario.

El subprograma "Hello, World" está completo tal como está. El único método anulado es el método de pintura.

Invocar un applet

Se puede invocar un subprograma incrustando directivas en un archivo HTML y viendo el archivo a través de un visor de subprogramas o un navegador habilitado para Java.

La etiqueta <applet> es la base para incrustar un applet en un archivo HTML. A continuación se muestra un ejemplo que invoca el subprograma "Hello, World":

<html>
   <title>The Hello, World Applet</title>
   <hr>
   <applet code = "HelloWorldApplet.class" width = "320" height = "120">
      If your browser was Java-enabled, a "Hello, World"
      message would appear here.
   </applet>
   <hr>
</html>

Note- Puede consultar HTML Applet Tag para comprender más acerca de cómo llamar a un applet desde HTML.

El atributo de código de la etiqueta <applet> es obligatorio. Especifica la clase Applet que se ejecutará. El ancho y el alto también son necesarios para especificar el tamaño inicial del panel en el que se ejecuta un subprograma. La directiva del subprograma debe cerrarse con una etiqueta </applet>.

Si un subprograma toma parámetros, se pueden pasar valores para los parámetros agregando etiquetas <param> entre <applet> y </applet>. El navegador ignora el texto y otras etiquetas entre las etiquetas del subprograma.

Los navegadores no habilitados para Java no procesan <applet> y </applet>. Por lo tanto, cualquier cosa que aparezca entre las etiquetas, que no esté relacionada con el subprograma, es visible en los navegadores no habilitados para Java.

El visor o navegador busca el código Java compilado en la ubicación del documento. Para especificar lo contrario, use el atributo de base de código de la etiqueta <applet> como se muestra:

<applet codebase = "https://amrood.com/applets" code = "HelloWorldApplet.class"
   width = "320" height = "120">

Si un subprograma reside en un paquete que no es el predeterminado, el paquete que contiene debe especificarse en el atributo de código usando el carácter de punto (.) Para separar los componentes del paquete / clase. Por ejemplo

<applet  = "mypackage.subpackage.TestApplet.class" 
   width = "320" height = "120">

Obtener parámetros de subprograma

El siguiente ejemplo demuestra cómo hacer que un subprograma responda a los parámetros de configuración especificados en el documento. Este subprograma muestra un patrón de tablero de ajedrez de negro y un segundo color.

El segundo color y el tamaño de cada cuadrado se pueden especificar como parámetros para el subprograma dentro del documento.

CheckerApplet obtiene sus parámetros en el método init (). También puede obtener sus parámetros en el método paint (). Sin embargo, obtener los valores y guardar la configuración una vez al inicio del subprograma, en lugar de cada actualización, es conveniente y eficiente.

El visor o navegador de applets llama al método init () de cada applet que ejecuta. El espectador llama a init () una vez, inmediatamente después de cargar el subprograma. (Applet.init () se implementa para no hacer nada.) Anule la implementación predeterminada para insertar código de inicialización personalizado.

El método Applet.getParameter () obtiene un parámetro dado el nombre del parámetro (el valor de un parámetro es siempre una cadena). Si el valor es numérico u otros datos que no son caracteres, la cadena debe analizarse.

El siguiente es un esqueleto de CheckerApplet.java:

import java.applet.*;
import java.awt.*;

public class CheckerApplet extends Applet {
   int squareSize = 50;   // initialized to default size
   public void init() {}
   private void parseSquareSize (String param) {}
   private Color parseColor (String param) {}
   public void paint (Graphics g) {}
}

Aquí están los métodos init () y privado parseSquareSize () de CheckerApplet:

public void init () {
   String squareSizeParam = getParameter ("squareSize");
   parseSquareSize (squareSizeParam);
   
   String colorParam = getParameter ("color");
   Color fg = parseColor (colorParam);
   
   setBackground (Color.black);
   setForeground (fg);
}

private void parseSquareSize (String param) {
   if (param == null) return;
   try {
      squareSize = Integer.parseInt (param);
   } catch (Exception e) {
      // Let default value remain
   }
}

El subprograma llama a parseSquareSize () para analizar el parámetro squareSize. parseSquareSize () llama al método de biblioteca Integer.parseInt (), que analiza una cadena y devuelve un número entero. Integer.parseInt () lanza una excepción siempre que su argumento no es válido.

Por lo tanto, parseSquareSize () detecta excepciones, en lugar de permitir que el subprograma falle en una entrada incorrecta.

El subprograma llama a parseColor () para analizar el parámetro de color en un valor de Color. parseColor () hace una serie de comparaciones de cadenas para hacer coincidir el valor del parámetro con el nombre de un color predefinido. Necesita implementar estos métodos para que este applet funcione.

Especificación de parámetros de subprograma

El siguiente es un ejemplo de un archivo HTML con un CheckerApplet incrustado en él. El archivo HTML especifica ambos parámetros para el subprograma mediante la etiqueta <param>.

<html>
   <title>Checkerboard Applet</title>
   <hr>
   <applet code = "CheckerApplet.class" width = "480" height = "320">
      <param name = "color" value = "blue">
      <param name = "squaresize" value = "30">
   </applet>
   <hr>
</html>

Note - Los nombres de los parámetros no distinguen entre mayúsculas y minúsculas.

Conversión de aplicaciones a applets

Es fácil convertir una aplicación gráfica de Java (es decir, una aplicación que usa AWT y que puede comenzar con el lanzador de programas de Java) en un subprograma que puede incrustar en una página web.

Los siguientes son los pasos específicos para convertir una aplicación en un subprograma.

  • Cree una página HTML con la etiqueta adecuada para cargar el código del subprograma.

  • Proporcione una subclase de la clase JApplet. Haz pública esta clase. De lo contrario, el subprograma no se puede cargar.

  • Elimina el método principal de la aplicación. No construya una ventana de marco para la aplicación. Su aplicación se mostrará dentro del navegador.

  • Mueva cualquier código de inicialización del constructor de la ventana del marco al método init del subprograma. No es necesario construir explícitamente el objeto de subprograma. El navegador lo instancia por usted y llama al método init.

  • Elimine la llamada a setSize; para los applets, el tamaño se realiza con los parámetros de ancho y alto en el archivo HTML.

  • Elimine la llamada a setDefaultCloseOperation. No se puede cerrar un applet; termina cuando el navegador sale.

  • Si la aplicación llama a setTitle, elimine la llamada al método. Los applets no pueden tener barras de título. (Por supuesto, puede asignar un título a la página web mediante la etiqueta HTML title).

  • No llames a setVisible (verdadero). El subprograma se muestra automáticamente.

Manejo de eventos

Los applets heredan un grupo de métodos de manejo de eventos de la clase Container. La clase Container define varios métodos, como processKeyEvent y processMouseEvent, para manejar tipos particulares de eventos, y luego un método catch-all llamado processEvent.

Para reaccionar a un evento, un subprograma debe anular el método específico del evento apropiado.

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.applet.Applet;
import java.awt.Graphics;

public class ExampleEventHandling extends Applet implements MouseListener {
   StringBuffer strBuffer;

   public void init() {
      addMouseListener(this);
      strBuffer = new StringBuffer();
      addItem("initializing the apple ");
   }

   public void start() {
      addItem("starting the applet ");
   }

   public void stop() {
      addItem("stopping the applet ");
   }

   public void destroy() {
      addItem("unloading the applet");
   }

   void addItem(String word) {
      System.out.println(word);
      strBuffer.append(word);
      repaint();
   }

   public void paint(Graphics g) {
      // Draw a Rectangle around the applet's display area.
      g.drawRect(0, 0, 
      getWidth() - 1,
      getHeight() - 1);

      // display the string inside the rectangle.
      g.drawString(strBuffer.toString(), 10, 20);
   }

   
   public void mouseEntered(MouseEvent event) {
   }
   public void mouseExited(MouseEvent event) {
   }
   public void mousePressed(MouseEvent event) {
   }
   public void mouseReleased(MouseEvent event) {
   }
   public void mouseClicked(MouseEvent event) {
      addItem("mouse clicked! ");
   }
}

Ahora, llamemos a este applet de la siguiente manera:

<html>
   <title>Event Handling</title>
   <hr>
   <applet code = "ExampleEventHandling.class" 
      width = "300" height = "300">
   </applet>
   <hr>
</html>

Inicialmente, el subprograma mostrará "inicializando el subprograma. Iniciando el subprograma". Luego, una vez que haga clic dentro del rectángulo, también se mostrará "clic del mouse".

Visualización de imágenes

Un subprograma puede mostrar imágenes en formato GIF, JPEG, BMP y otros. Para mostrar una imagen dentro del subprograma, usa el método drawImage () que se encuentra en la clase java.awt.Graphics.

A continuación se muestra un ejemplo que ilustra todos los pasos para mostrar imágenes:

import java.applet.*;
import java.awt.*;
import java.net.*;

public class ImageDemo extends Applet {
   private Image image;
   private AppletContext context;
   
   public void init() {
      context = this.getAppletContext();
      String imageURL = this.getParameter("image");
      if(imageURL == null) {
         imageURL = "java.jpg";
      }
      try {
         URL url = new URL(this.getDocumentBase(), imageURL);
         image = context.getImage(url);
      } catch (MalformedURLException e) {
         e.printStackTrace();
         // Display in browser status bar
         context.showStatus("Could not load image!");
      }
   }
   
   public void paint(Graphics g) {
      context.showStatus("Displaying image");
      g.drawImage(image, 0, 0, 200, 84, null);
      g.drawString("www.javalicense.com", 35, 100);
   }  
}

Ahora, llamemos a este applet de la siguiente manera:

<html>
   <title>The ImageDemo applet</title>
   <hr>
   <applet code = "ImageDemo.class" width = "300" height = "200">
      <param name = "image" value = "java.jpg">
   </applet>
   <hr>
</html>

Reproducción de audio

Un subprograma puede reproducir un archivo de audio representado por la interfaz AudioClip en el paquete java.applet. La interfaz AudioClip tiene tres métodos, que incluyen:

  • public void play() - Reproduce el clip de audio una vez, desde el principio.

  • public void loop() - Hace que el clip de audio se reproduzca continuamente.

  • public void stop() - Detiene la reproducción del clip de audio.

Para obtener un objeto AudioClip, debe invocar el método getAudioClip () de la clase Applet. El método getAudioClip () devuelve inmediatamente, ya sea que la URL se resuelva o no en un archivo de audio real. El archivo de audio no se descarga hasta que se intenta reproducir el clip de audio.

A continuación se muestra un ejemplo que ilustra todos los pasos para reproducir un audio:

import java.applet.*;
import java.awt.*;
import java.net.*;

public class AudioDemo extends Applet {
   private AudioClip clip;
   private AppletContext context;
   
   public void init() {
      context = this.getAppletContext();
      String audioURL = this.getParameter("audio");
      if(audioURL == null) {
         audioURL = "default.au";
      }
      try {
         URL url = new URL(this.getDocumentBase(), audioURL);
         clip = context.getAudioClip(url);
      } catch (MalformedURLException e) {
         e.printStackTrace();
         context.showStatus("Could not load audio file!");
      }
   }
   
   public void start() {
      if(clip != null) {
         clip.loop();
      }
   }
   
   public void stop() {
      if(clip != null) {
         clip.stop();
      }
   }
}

Ahora, llamemos a este applet de la siguiente manera:

<html>
   <title>The ImageDemo applet</title>
   <hr>
   <applet code = "ImageDemo.class" width = "0" height = "0">
      <param name = "audio" value = "test.wav">
   </applet>
   <hr>
</html>

Puede usar test.wav en su PC para probar el ejemplo anterior.