Aplicaciones diseadas para ejecutarse en el contexto de ejecucin de un
Navegador. El Applet se responsabiliza de la gestin de la parte de la zona de visualizacin del documento que el Navegador le asigna. Esta rea ofrece un interfaz grfico (en contraposicin al modo texto o consola): Se rompe la nocin de secuencialidad. Programacin dirigida por eventos. Se necesita un conjunto de primitivas grficas que permitan manipular la pantalla. Existe un conjunto de componentes estndar. Necesita un sistema de gestin de ubicacin de componentes sin formato fijo, es decir, sin posiciones y tamaos absolutos. Caractersticas de los Applets La salida no se basa en mtodos orientados a consola (System.out.print). Se utilizan en su lugar primitivas para: crear lneas, crculos y dems objetos geomtricos, para gestionar colores de relleno y fondo, gestionar texto (tipos de fuentes y tamaos), etc. La entrada no se basa en mtodos orientados a consola (System.in.read). Las aplicaciones grficas se estructuran segn el modelo de programacin dirigida por eventos. Las bibliotecas de Java tambin definen componentes estndar (AWT). El fichero HTML ..... <APPLET CODE="x.class" HEIGHT=400 WIDTH=700></APPLET> ..... El navegador (cliente) carga un Applet (x.class) de la mquina servidora y lo ejecuta (posee una mquina virtual Java), es decir, crea una instancia de la clase y lanza sobre la misma una secuencia de mensajes determinados (ciclo de vida del Applet). Funcionamiento de los Applets Todo Applet se implementa como una extensin de la clase Applet del paquete java.applet. La clase Applet deriva de Panel que a su vez deriva de Container que a su vez deriva de Component, por lo que hereda las primitivas grficas, componentes de interfaz, etc. de estas clases. La respuesta de un Applet ante los eventos de usuario, por defecto, es no hacer nada. La tarea del programador consiste en extender la clase Applet e implementar la respuesta a los distintos eventos que puedan producirse. Ejemplo import java.awt.Graphics; public class hola extends java.applet.Applet { public void paint( Graphics g ) { g.drawString("Hola",20,20); } } <HTML> <HEAD> saludo </HEAD> <BODY> <APPLET CODE="hola.class" WIDTH=600 HEIGHT=400></APPLET> </BODY> </HTML> Ciclo de vida de un Applet MENSAJ E EVENTO DEL NAVEGADOR COMPORTAMI ENTO init Carga documento HTML con marca <APPLET> y la clase principal Cdigo de inicializacin (inicializar campos, aadir componentes de interaccin, etc.) start Tras init y cada vez que se vuelva a visitar el applet con el navegador. Iniciar animaciones y otras tareas. stop Cada vez que se abandona un applet Suspender animaciones y otras tareas destroy Termina el applet (se descarta el documento o se abandona el navegador) Limpieza de los recursos del sistema paint Cada vez que se detecta la necesidad de pintar el rea de pantalla del applet Redibujar lo necesario en el rea de interaccin Grficos Sistema de coordenadas: Bidimensional. La esquina superior izquierda se considera el (0,0). La componente x crece hacia la derecha y la y hacia abajo. Figuras: Lneas, rectngulos, crculos, etc. Toda accin de dibujo se realiza a travs de la clase Graphics. El cdigo de dibujo debe aparecer en el mtodo paint( Graphics g) El objeto g es pasado por el entorno (Contexto grfico). Color. Texto. Imgenes (gif, getImage, getDocumentBase, drawImage, etc.). Sonido (au, getAudioClip, etc.). Componentes de Interfaz de usuario Applet import java.awt.*; public class p extends java.applet.Applet { public void paint(Graphics g){ g.drawString("Hola",20,20); } } Texto (Font) import java.awt.*; public class p extends java.applet.Applet { public void paint(Graphics g) { g.drawString("Mensaje de prueba",10,10); Font f = new Font("Courier",Font.BOLD,14); g.setFont(f); g.drawString("Mensaje de prueba",10,50); } } Etiqueta (Label) import java.awt.*; public class p extends java.applet.Applet { public void init() { add(new Label("Una etiqueta")); add(new Label("otra",Label.RIGHT)); } } Botn (Button) import java.awt.*; import java.awt.event.*; public class p extends java.applet.Applet { Button b,borra; public void init() { b = new Button("yo"); add(b); b.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent e) { showStatus("Nemesio Expsito"); } }); borra = new Button("borra nombre"); add(borra); borra.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent e) { showStatus(""); } }); } } Campo de texto (TextField) import java.awt.*; import java.awt.event.*; public class p extends java.applet.Applet { TextField t; public void init() { t = new TextField("este es el valor por defecto"); add(t); t.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { escribe(); } }); } public void escribe() { showStatus("has escrito \""+t.getText()+"\""); } } rea de Texto (TextArea) import java.awt.*; import java.awt.event.*; public class p extends java.applet.Applet { TextArea ta; public void init() { ta = new TextArea(" tira \n de caracteres que \n +ocupa varias lineas",3,10); add(ta); ta.addTextListener( new TextListener() { public void textValueChanged(TextEvent e) { escribe(); } }); } public void escribe() { showStatus("has escrito \""+ta.getText()+"\""); } } Lienzo o tapiz (Canvas) import java.awt.*; import java.awt.event.*; public class p extends java.applet.Applet { ZonaDibujo papel; public void init() { resize(200,200); papel= new ZonaDibujo(); add(papel); } } class ZonaDibujo extends Canvas { public ZonaDibujo() { resize(100,100); addMouseListener( new MouseAdapter(){ public void mousePressed(MouseEvent e) { int x=e.getX(), y=e.getY(); getGraphics().drawString("("+x+","+y+")",x,y); } }); } public void paint(Graphics g) { g.drawRect(0,0,99,99); // dibuja un borde alrededor del canvas } } Lista desplegable (Choice) import java.awt.*; import java.awt.event.*; public class p extends java.applet.Applet { Choice c; public void init() { c = new Choice(); c.addItem("Rojo"); c.addItem("Verde"); c.addItem("Azul"); add(c); c.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange()==ItemEvent.SELECTED) escribeSel(); else borra(); } }); } void escribeSel() { showStatus("seleccionado "+ c.getSelectedItem()); } void borra() { showStatus(""); } } Casilla de verificacin (Checkbox) import java.awt.*; import java.awt.event.*; public class p extends java.applet.Applet { Checkbox c; public void init() { c = new Checkbox("etiqueta"); add(c); c.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange()==ItemEvent.SELECTED) escribeSel(); else borra(); } }); } void escribeSel() { showStatus("activo"); } void borra() { showStatus(""); } } Botones de radio (CheckboxGroup) import java.awt.*; public class p extends java.applet.Applet { public void init() { CheckboxGroup g= new CheckboxGroup(); add(new Checkbox("etiqueta 1",g,true)); add(new Checkbox("etiqueta 2",g,false)); } } Lista (List) import java.awt.*; public class p extends java.applet.Applet { List prov1, provN; public void init() { String[] items = { "Murcia","Castelln","Valencia","Alicante", "Barcelona","Tarragona","Almera" }; prov1= new List(5); for (int i=0; i<items.length; i++) prov1.addItem(items[i]); add(prov1); provN= new List(5,true); for (int i=0; i<items.length; i++) provN.addItem(items[i]); add(provN); } } Programacin dirigida por eventos Divisin de responsabilidades Navegador: Detecta en qu momentos hay que repintar la pantalla Avisa al applet y le proporciona un contexto grfico asociado al rea de visualizacin llamando al mtodo paint(). Recoge eventos externos y los pasa al applet mediante llamadas a los manejadores de eventos del applet. Applet: Realiza las acciones pertinentes cuando las solicita el navegador: pintar, responder a eventos externos, etc. sobreescribiendo los mtodos adecuados. Tipos de eventos Todos los eventos son subclases de java.util.EventObject. Eventos producidos por usuario: teclado, ratn, accin sobre componentes de interaccin. Clase java.awt.AWTEvent de la biblioteca java.awt.event. El modelo de Eventos de Java: Fuente-Oyente Cada Evento posee un objeto fuente (getSource()) y un tipo (getID()). Tipo de Evento: Eventos representados por la misma clase. Cada clase define un conjunto de mtodos adecuados para cada tipo de evento definido. Modelo de eventos: La idea: Un objeto fuente genera una evento y notifica dicho evento a todos los objetos de la lista llamando al mtodo adecuado sobre el oyente y pasndole el Evento como parmetro. fuente oyente oyente oyente Lista de oyentes (eventListener) Funcionamiento El objeto fuente dispone de mtodos para aadir oyentes a su lista (addMouseListener, addMouseMotionListener, ), y para quitarlos de la lista (removeMouseListener, removeMouseMotionListener, ). Todos los oyentes deben implementar el mtodo adecuado. Esto se garantiza obligando a que los oyentes que deseen ser notificados por la fuente del Evento implementen una determinada interfaz (ActionEventActionListener). El paquete java.awt.event define un interfaz para cada clase de Evento (excepto para la clase MouseEvent) Adaptadores Problema: Slo interesa responder a un tipo de evento de los definidos en el interfaz. Para cada Clase de Evento cuya interfaz posee ms de un mtodo (ms de un tipo de evento), se dispone de una clase adaptador que implementa dicha interfaz con cdigo vaco. package java.awt.event; public abstract class WindowAdapter implements WindowListener { public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} } Componentes de interaccin como fuentes de eventos Una vez creada la clase para el oyente hay que: instanciar un objeto de dicha clase y registrarla en la correspondiente fuente de eventos. Mediante los mtodos addXListener de la fuente se registran (aaden a la lista) los oyentes de la clase XEvent (que implementan el interface XListener). Mediante los mtodos removeXListener se quitan de dicha lista. Clases anidadas para manejadores de eventos Los manejadores de eventos son objetos instancias de clases que implementan los mtodos definidos en la interfaz adecuada. En la versin 1.1.6 del JDK es posible definir clases dentro de clases y, adems, instanciar objetos de clases al mismo tiempo que se declaran: borra.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { borra(); } }); addMouseMotionListener( new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { otroPunto(e.getX(),e.getY()); } }); class pActionListener implements ActionListener { Applet a; pActionListener(Applet app) { a = app; } public void actionPerformed (ActionEvent e) { a.showStatus("Nemesio Expsito"); } } public class p extends java.applet.Applet { Button b,borra; public void init() { b = new Button("yo"); add(b); b.addActionListener( new pActionListener(this) ); borra = new Button("borra nombre"); add(borra); borra.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent e) { showStatus(""); } }); } } public class p extends java.applet.Applet { Button b,borra; class pActionListener implements ActionListener { Applet a; pActionListener(Applet app) { a = app; } public void actionPerformed (ActionEvent e) { a.showStatus("Nemesio Expsito"); } } public void init() { b = new Button("yo"); add(b); b.addActionListener( new pActionListener(this) ); borra = new Button("borra nombre"); add(borra); borra.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent e) { showStatus(""); } }); } } public class p extends java.applet.Applet { Button b,borra; class pActionListener implements ActionListener { public void actionPerformed (ActionEvent e) { showStatus("Nemesio Expsito"); } } public void init() { b = new Button("yo"); add(b); b.addActionListener( new pActionListener() ); borra = new Button("borra nombre"); add(borra); borra.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent e) { showStatus(""); } }); } } public class p extends java.applet.Applet { Button b,borra; public void init() { b = new Button("yo"); add(b); b.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent e) { showStatus("Nemesio Expsito"); } }); borra = new Button("borra nombre"); add(borra); borra.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent e) { showStatus(""); } }); } } Contentedores y gestores de ubicacin Contenedores Los contenedores agrupan varios componentes. Los contenedores distribuyen dichos componentes de la manera ms adecuada. Los contenedores son, a su vez, componentes. Los contenedores contienen el cdigo necesario para el control de eventos, cambiar la forma del cursor o modificar el icono de la aplicacin. Contenedores del AWT Paneles (Panel) Contenedor genrico de componentes, no tiene representacin visual Suele utilizarse para distribuir componentes de una determinada manera Ventanas (Window) Concepto tpico de ventana (aplicacin, dilogo, etc. ) No puede incluirse en otro contenedor Sirve como clase base para marcos y ventanas de dilogo Dispone de mtodos especficos para alterar la posicin, el tamao, ttulo, forma del cursor y barra de mens Marcos (Frame) Ventana con borde y ttulo Generan varios tipos de eventos Ventanas de dilogo (Dialog) Ventana con borde y ttulo que permite recoger entradas de usuario Se lanza desde otra ventana Puede ser modal o no (si es necesario cerrar el dilogo antes de proseguir con la aplicacin) Se puede redimensionar y mover pero no maximizar o minimizar Jerarqua de clases del AWT Container Window Panel Frame Dialog Applet Component Gestores de ubicacin Los elementos No se sitan en la pantalla mediante coordenadas absolutas sino mediante posiciones relativas entre s. Los componentes: Poseen un tamao mnimo y un tamao preferido (mtodo PreferredSize). Pueden indicar el espacio alrededor de su borde interior (mtodo insets). El gestor de ubicacin parte de estas indicaciones y, a partir de la poltica establecida, hace lo que puede. Sugerencia: Dividir el espacio disponible en varios paneles y gestionar su ubicacin particular para cada uno de ellos. El contenedor ms comn es Panel. Los gestores de ubicacin se encargan de ubicar los componentes en contenedores. Cada contenedor contiene una objeto gestor de ubicacin al que se le hacen llamadas (Container.add). Dado que los contenedores son componentes, se pueden anidar. Gestores de ubicacin predefinidos Flujo (FlowLayout) Bordes (BorderLayout) Rejilla (GridLayout) Tarjetas (CardLayout) Flujo (FlowLayout) Ubica los componentes de izquierda a derecha hasta lograr la lnea antes de pasar a la siguiente. Es el que se utiliza por defecto. import java.awt.*; public class p extends java.applet.Applet { public void init() { setLayout(new FlowLayout()); add(new Button("Ok")); add(new Button("Cancel")); } } Bordes (BorderLayout) Ubica los componentes en cinco posibles lugares: Norte, Sur, Este, Oeste y Centro. No es necesario cubrir todas las ubicaciones. Los componentes se redimensionan para ocupar todo el espacio del panel. import java.awt.*; public class p extends java.applet.Applet { public void init() { setLayout(new BorderLayout()); add("North", new Label("Por ejemplo una cabecera")); add("South", new TextField("aqui escribimos un mensaje")); add("West", new Button("SALIR")); add("East", new Button("AYUDA")); add("Center", new TextArea("ejemplo de \n texto en + \nla parte central")); } } Rejilla (GridLayout) Ubica los componentes en una matriz de filas y columnas. Se rellena por filas. import java.awt.*; public class p extends java.applet.Applet { public void init() { setLayout(new GridLayout(3,2)); for (int i=1; i<7; i++) add(new Button(""+i)); } } Tarjetas (CardLayout) Visualiza un slo componente cada vez expandido en todo el contenedor. Se referencian mediante una tira definida por el programador, pueden mostrarse mediante show con la tira apropiada. public class p extends java.applet.Applet { CardLayout ubi; public void init() { ubi = new CardLayout(); setLayout(ubi); Button bj,bp,ba; bj= new Button("Juan"); bp= new Button("Pepe"); ba= new Button("Ana"); add("Juan",bj); add("Pepe",bp); add("Ana",ba); ubi.show(this,"Ana"); bj.addActionListener (new ActionListener() { public void actionPerformed(ActionEvent e) { muestra("Pepe"); } }); bp.addActionListener (new ActionListener() { public void actionPerformed(ActionEvent e) { muestra("Ana"); } }); ba.addActionListener (new ActionListener() { public void actionPerformed(ActionEvent e) { muestra("Juan"); } }); } void muestra(String s) { ubi.show(this,s); } } GridBagLayout y GridBagConstraints Parecido a GridLayout pero ms flexible: permite que un componente ocupe varias celdas. Paso de parmetros en ficheros HTML <APPLET CODEBASE=URL CODE=applet.class HEIGHT=100 WIDTH=50> < PARAM NAME=p1 VALUE=230> < PARAM NAME=p2 VALUE=Pedro Alonso> . . . < PARAM NAME=direcCorreo VALUE=palonso@dsic.upv.es> </APPLET> Desde el Applet se invoca el parmetro mediante Applet.getParam(nombreParametro) que devuelve el String correspondiente al valor del parmetro indicado. import java.awt.*; public class p extends java.applet.Applet { public void init() { System.out.println(Anchura = + getParameter("ancho")); System.out.println("p1 vale " + getParameter("p1")); System.out.println("p2 vale " + getParameter("p2")); } } Restricciones y posibilidades de los Applets Desde el punto de vista de la seguridad la ejecucin en una mquina cliente de un programa cargado de un servidor remoto es un riesgo. Lenguaje seguro (sin punteros, comprobaciones en ejecucin, ) Contexto de ejecucin rgido: Un applet no puede abandonar el intrprete Java, definir mtodos nativos, enlazar dinmicamente con bibliotecas nativas ni arrancar programas en la mquina cliente. No puede leer/escribir ficheros sobre la mquina local ni acceder a otros recursos del sistema. Slo puede abrir conexiones de red con el servidor desde el que ha descargado. Las ventanas abiertas por el applet poseen un aspecto distinto a las abiertas por una aplicacin. Sin embargo, tienen ventajas sobre aplicaciones Java aisladas: Reproduccin de sonido, abrir conexiones de red con la mquina remota, visualizar documentos HTML, invocar mtodos pblicos de otros applets en la misma mquina.