Java - Conceptos básicos de los subprogramas
Un subprograma es un programa Java que se ejecuta en un navegador Web. Un applet 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 applet y una aplicación Java independiente, incluidas las siguientes −
-
Un applet es una clase de Java que amplía la clase java.applet.Applet.
-
Un método main() no se invoca en un subprograma y una clase de subprograma 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 applet. La JVM puede ser un complemento del navegador web o un entorno de tiempo 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 útil del subprograma.
-
Los applets tienen estrictas reglas de seguridad que aplica el navegador web. La seguridad de un applet a menudo se denomina seguridad de sandbox, comparando el applet con un niño jugando en un sandbox con varias reglas que deben seguirse.
-
Otras clases que necesita el applet 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 −
-
iniciar − Este método está diseñado para cualquier inicialización que se necesite para su applet. Se llama después de que se hayan procesado las etiquetas param dentro de la etiqueta del applet.
-
empezar − 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 applet después de haber ido a otras páginas.
-
detener − 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, puede llamarse repetidamente en el mismo applet.
-
destruir − Este método solo se llama cuando el navegador se cierra 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 abandone la página que contiene el subprograma.
-
pintura − Se invoca inmediatamente después del método start(), y también cada vez que el subprograma necesita volver a dibujarse en el navegador. El método paint() en realidad se hereda de java.awt.
Un subprograma "Hola mundo"
El siguiente es 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 alcance de nuestra clase de applet −
- java.applet.Applet
- java.awt.Gráficos
Sin esas instrucciones de importación, el compilador de Java no reconocería las clases Applet y Graphics, a las que se refiere la clase de applet.
La clase 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 del subprograma
- Obtener la ubicación de red del archivo HTML que contiene el subprograma
- Obtenga 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 espectador o navegador obtiene información sobre el applet y controla la ejecución del applet. El espectador puede −
- Solicite información sobre el autor, la versión y los derechos de autor del subprograma
- Solicitar una descripción de los parámetros que reconoce el applet
- Inicialice el subprograma
- Destruir el subprograma
- Iniciar la ejecución del applet
- Detener la ejecución del applet
La clase Applet proporciona implementaciones predeterminadas de cada uno de estos métodos. Esas implementaciones pueden anularse 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 subprograma
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
<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>
Nota − Puede consultar la etiqueta HTML Applet para obtener más información sobre cómo llamar a un applet desde HTML.
Se requiere el atributo de código de la etiqueta .
Si un subprograma toma parámetros, se pueden pasar valores para los parámetros agregando etiquetas entre . El navegador ignora el texto y otras etiquetas entre las etiquetas del subprograma.
Los navegadores no habilitados para Java no procesan . Por lo tanto, todo lo que aparece entre las etiquetas, no relacionado con el subprograma, es visible en 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 codebase = "https://amrood.com/applets" code = "HelloWorldApplet.class" width = "320" height = "120">
Si un subprograma reside en un paquete que no sea el predeterminado, el paquete contenedor 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">
Obtención de parámetros del 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 color 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 de applets o navegador llama al método init() de cada applet que ejecuta. El espectador llama a init() una vez, inmediatamente después de cargar el applet. (Applet.init() está implementado para no hacer nada). Anule la implementación predeterminada para insertar un 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 sean 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 applet 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 cada vez que su argumento no es válido.
Por lo tanto, parseSquareSize() detecta excepciones, en lugar de permitir que el subprograma falle con una entrada incorrecta.
El applet llama a parseColor() para analizar el parámetro de color en un valor de Color. parseColor() realiza una serie de comparaciones de cadenas para hacer coincidir el valor del parámetro con el nombre de un color predefinido. Debe implementar estos métodos para que este subprograma funcione.
Especificación de los parámetros del subprograma
El siguiente es un ejemplo de un archivo HTML con un CheckerApplet incrustado. El archivo HTML especifica ambos parámetros para el applet por medio de la etiqueta .
<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>
Nota − 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 Java gráfica (es decir, una aplicación que utiliza el AWT y que puede iniciar con el iniciador de programas 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 applet.
-
Proporcione una subclase de la clase JApplet. Haz pública esta clase. De lo contrario, el applet no se puede cargar.
-
Eliminar el método principal en 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 ventana de marco al método init del applet. No es necesario construir explícitamente el objeto applet. El navegador lo instancia por usted y llama al método init.
-
Elimina la llamada a setSize; para los applets, el tamaño se realiza con los parámetros de ancho y alto en el archivo HTML.
-
Quite la llamada a setDefaultCloseOperation. Un applet no se puede cerrar; termina cuando se cierra el navegador.
-
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 ponerle título a la página web usando la etiqueta de título HTML).
-
No llame a setVisible (verdadero). El applet se muestra automáticamente.
Gestión 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 general llamado processEvent.
Para reaccionar a un evento, un subprograma debe anular el método específico del evento adecuado.
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 subprograma 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 con el mouse".
Mostrar imágenes
Un applet puede mostrar imágenes en formato GIF, JPEG, BMP y otros. Para mostrar una imagen dentro del applet, utilice 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 subprograma 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 −
-
juego público vacío() − Reproduce el clip de audio una vez, desde el principio.
-
bucle vacío público() − Hace que el clip de audio se reproduzca continuamente.
-
parada vacía pública() − 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() regresa 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.
El siguiente es 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 subprograma 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.
Java