APPLETSJAVA
QUESUNAPPLET?
Un applet es una clase Java que se incrusta en una pgina HTML y que es descargada y ejecutadaporunnavegador.EsuntipoespecficodecontenedordetecnologaJava.Difierede una aplicacin en la manera como se ejecuta: una aplicacin comienza cuando se invoca su mtodomain;sinembargoelciclodevidadeunappletesmscomplejo. Unappletseejecutaenelentornodeunnavegador,esdecir,nocomienzadirectamenteporla ejecucin de un comando. Es necesario crear un fichero HTML que le indica al navegador lo quedebecargarycmoejecutarlo; luegoseleindicaalnavegadorcmoaccederalaURL que especificaeseficheroHTML. ElnavegadorenelclientecargalaURLdondeseofreceelelementoWeb. ElnavegadorcargaeldocumentoHTMLelcualcontendrunareferenciaalapplet. Elnavegadorcargalasclasesnecesariasparaejecutarelapplet. Elnavegadorejecutaelapplet.
Restriccionesdeseguridaddeunapplet
Los applets son trozos de cdigo que representan un peligro potencial, ya que se cargan a travs de la red. Qu ocurre si alguien escribe una clase malintencionada que lee ficheros privados y los enva a travs de Internet? La profundidad a la que se controla la seguridad se implementaaniveldelnavegador. Prohibicionespordefectoenlamayoradelosnavegadores: Ejecucindeotroprogramaapartirdelapplet. Entradas/Salidasdeficheros. Invocacionesamtodosnativos. Intentosdeabrirunsocketenotrosistemadistintoalqueproveeelapplet.
Estas restricciones evitan que el applet viole la privacidad o dae un sistema remoto, restringindole el acceso a los ficheros del sistema. Impedir la ejecucin de otro programa y prohibir las invocaciones a mtodos nativos no permiten que el applet ejecute cdigo que se ejecutara sin validacin de la JVM. La restriccin de los sockets impide la comunicacin con otroprograma,queestaraalmacenadoenunservidornoconfiable.
ESCRITURADEUNAPPLET
Para escribir un applet se debe crear una clase pblica que sea una sublcase de java.applet.Applet import java.applet.*; public class HelloWorld extends Applet La clase java.applet.Applet es subclase de java.awt.Panel. Las jerarquas del appletydeclasesdelAWTsevenenlasiguientefigura,mostrandostaqueesposibleusarun applet directamente como el punto inicial para un esquema del AWT. Dado que un applet es un Panel, tiene por defecto un gestor FlowLayout. Los mtodos de las clases Component,ContaineryPanelsonheredadosporlaclaseApplet.
En una aplicacin, el programa comienza cuando se invoca el mtodo main. Con los applets ste no es el caso: Despus de que constructor termine, el navegador invoca un mtodo llamado init para realizar la inicializacin bsica del applet. Cuando termina init, el navegador invoca el mtodo start. Este mtodo se invoca en general cuando el applet se hacevisible. Los mtodos init y start se ejecutan completamente antes de que el applet est vivo y, porestarazn,ellosnodebenusarseparaprogramaruncomportamientocontinuo.Dehecho, a diferencia del mtodo main de una aplicacin, no existe ningn mtodo que se ejecuta de manera continua a lo largo de la vida del applet. Los mtodos del usuario adicionales en la subclaseappletpuedenincluirstop,destroyypaint.
MTODOSYCICLODEVIDA
El ciclo de vida del applet es ms complejo que lo descrito hasta ahora. Existen 3 mtodos principalesrelacionadosconsuciclodevida:init,startystop. init: Se invoca cuando se crea y se carga el applet en un navegador capaz de soportar la tecnologa Java (como por ejemplo, appletviewer). El applet puede usar este mtodo para inicializar los valores de los datos. El mtodo init se ejecuta completamenteantesdeinvocarstart. public void init(){ // set up GUI } start:Cuandosehacompletadoel mtodoinitseejecuta elmtodostart,que hacequeelappletviva.Tambinseejecutacadavezqueelappletseavisible,como, por ejemplo, cuando se restaura el navegador despus de haber sido minimizado o cuando el navegador vuelve a la pgina que contiene el applet, despus de haberse desplazado a otro URL. Este mtodo es tpicamente utilizado para comenzar threads, unaanimacinoparareproducirsonidos. public void start(){ musicClip.play(); } stop: El mtodo stop se invoca cuando el applet se hace invisible. Esto sucede cuando el navegador es minimizado o sigue un enlace a otro URL. El applet usa este mtodo para detener cualquier funcionalidad que pudiera ocupar la CPU mientras el appletnoestenlapginaquemuestraelnavegador. public void stop(){ musicClip.stop(); }
Mientras que init es un mtodo inicitico que puede considerarse independiente, los mtodos start y stop forman una pareja. Tpicamente, start activa un comportamiento delappletystopdesactivaesecomportamiento.
DESPLIEGUEDEUNAPPLET
Los applets son grficos por naturaleza; aunque es posible invocar a System.out.println(), esto no se hace normalmente. En vez de esto, se despliegan elementosenelentornogrfico. Para dibujar en el panel de un applet se debe crear un mtodo paint. El entorno invoca al mtodo paint siempre que necesite redibujar el applet. Por ejemplo, cuando se despliega la ventanadelnavegadordespusdehabersidominimizadaoiconizada. Se debe escribir el mtodo paint para que funcione cuando se invoca de esta manera. La exposicinocurredemaneraasncronadirigidaporelentorno,noporelprograma. import java.awt.*; import java.applet.*; public class HelloWorld extends Applet{ private int paintCount; public void init(){ paintCount = 0; } public void paint(Graphics g){ g.drawString(Hello world, 25, 25); ++paintCount; g.drawString(N llamadas a paint: paintCount, 25, 50); } }
DIBUJOSENELAWT
Adems de los mtodos bsicos de su ciclo de vida bsico, un applet tiene mtodos importantes relacionados con su despliegue. Estos mtodos se declaran y documentan en la clase Component del AWT. Es necesario seguir el modelo correcto para la gestin del despliegueusandoelAWT. La actualizacin del despliegue o dibujo la hace un thread separado al que de ahora en adelante llamaremos thread del AWT. Este thread se invoca para gestionar dos situaciones relacionadasconlaactualizacindeldespliegue. Situacionesdeactualizacin: La primera de esas condiciones es la exposicin; cuando el applet se expone por primera vez o cuando parte de l ha sido daado y necesita ser reemplazado. El dao puede ocurrir en cualquier momento y el programa debe ser capaz de actualizar lazonadedespliegueencualquiermomento. La segunda condicin es cuando el programa redibuja el applet con nuevo contenido. Estaaccinpuederequerirqueseelimineprimerolaimagenanterior.
Mtodosbsicosdedespliegue
Los 3 mtodos bsicos relacionados con el despliegue o dibujo en pantalla del contenido del appletsonlossiguientes:(heredadosdelaclasePanel): paint: La gestin de la exposicin ocurre automticamente y genera una invocacin del mtodo paint. Una facilidad de la clase Graphics, llamada el rectngulo clip, optimiza el mtodo paint de manera que las actualizaciones no se hagan sobre el reacompletadelgrficoamenosqueseanecesario,sinoqueestasactualizacionesse restringen a la regin daada. Se recomienda sobrescribir el mtodo paint para controlarloquesedibujaenelapplet. repaint:Invocarelmtodorepaintprovocaunanotificacinalsistemadequese quiere cambiar la zona de despliegue. El mtodo repaint causa que el thread del AWTinvoqueaotromtodo,update. update:Elmtodoupdatelimpialazonadedespliegueeinvocaalmtodopaint. Se puede modificar el mtodo update, por ejemplo, para reducir el parpadeo invocandopaintsinlimpiarlazonadedespliegue.
Estrategiasdedesplieguedeapplets
El modelo del applet requiere que se adopte una estrategia especfica para el mantenimiento desudespliegue.Sedeberllevaracabolosiguiente: Mantener un modelo del despliegue, el cual define cmo restablecer el despliegue del applet en pantalla. Las instrucciones de cmo hacer esto estn contenidas en el mtodopaint. Hacerqueelmtodopaintrestablezcaeldesplieguebasadosloenelcontenidodel modelo. Esto permite que paint regenere el despliegue consistentemente siempre queseinvoque,yquegestionelaexposicincorrectamente. Hacer que el programa cambie el despliegue actualizando el modelo e invocando el mtodo repaint, para que el mtodo update (y finalmente el mtodo paint) se invoqueporelthreaddelAWT.
EJEMPLODEMODELODEDIBUJO
Con este ejemplo se quiere desplegar la cadena Hello world! en el panel del applet siempre queelusuariopulseconelratn. PRIMERA VERSIN: Una implementacin sencilla de este requerimiento sera desplegar la cadenaHelloworldcadavezqueelusuariopulseconelratnenelpaneldelapplet.Estose 4
puede lograr si se guarda el punto del click en el atributo lastClick. Desafortunadamente, el thread del AWT actualiza el applet usando el mtodo update, que limpia la pantalla antes deinvocaralmtodopaint. //<APPLET CODE=PaintModel.class WIDTH=200 HEIGHT=200></APPLET> import java.applet.*; import java.awt.event.; import java.awt.*; public class PaintModel extends Applet{ private Point lastClick = null; public void init(){ addMouseListener(new MyModelRecorder()); } public void paint(Graphics g){ if (lastClick != null){ g.drawString(Hello world!, lastClick.x, lastClick.y } } private class MyModelRecorder extends MouseAdapter{ public void mousePressed(MouseEvent e){ lastClick = e.getPoint(); } } } SEGUNDA VERSIN: Una solucin posible al problema de actualizacin es sobrescribir el mtodo update para no limpiar la pantalla antes de invocar paint, pero de nuevo, desafortunadamente, si el applet se oculta y luego se expone, los pxeles perdidos no se redibujan(exceptoelltimopunto). //<APPLET CODE=PaintModel.class WIDTH=200 HEIGHT=200></APPLET> import java.applet.*; import java.awt.event.; import java.awt.*; public class PaintModel extends Applet{ private Point lastClick = null; public void init(){ addMouseListener(new MyModelRecorder()); } public void update(Graphics g){ if (lastClick != null){ g.drawString(Hello world!, lastClick.x, lastClick.y } } private class MyModelRecorder extends MouseAdapter{ 5
public void mousePressed(MouseEvent e){ lastClick = e.getPoint(); } } }
TERCERA VERSIN: El ltimo modelo usa una lista de objetos Point para registrar la localizacin de cada uso de ratn. La gestin del evento mouse pressed aade puntos a la lista mouseClicks y el mtodo paint dibuja Hello world! en cada punto iterando sobre lalista.Deestaforma,danconunasolucin. //<APPLET CODE=PaintModel.class WIDTH=200 HEIGHT=200></APPLET> import java.applet.*; import java.awt.event.; import java.awt.*; import java.util.List; import java.util.ArrayList; public class PaintModel extends Applet{ private List mouseClicks = new ArrayList(); public void init(){ addMouseListener(new MyModelRecorder()); } public void paint(Graphics g){ paint(g); } public void paint(Graphics g){ for(int x=0; x<mouseClicks.size(); x++){ Point p = (Point)mouseClicks.get(i); g.drawString(Hello world!, p.x, p.y); } } private class MyModelRecorder extends MouseAdapter{ public void mousePressed(MouseEvent e){ mouseClicks.add(e.getPoint()); } } }
QUESELAPPLETVIEWER?
Normalmenteunappletseejecutadentrodeunnavegadoraunque,parasimplificaryacelerar eldesarrollo,Java2SDKofrecelaherramientaappletviewerque estdiseadaparavisualizar applets. El appletviewer es una aplicacin Java que permite la ejecucin de applets sin utilizar un navegador. Se puede considerar como un navegador mnimo. Para ello, lee el fichero HTML especificado por la URL de la lnea de comandos, despliega en la pantalla un espacio como el delframe,creaunainstanciadeunapplet,ydespliegaesainstanciadelappletenelFrame.
EstaherramientatomacomoargumentodelalneadecomandosunaURLdeunficheroHTML quecontienelareferenciaalapplet.Lanicaopcinvlidaparaelappletvieweresdebug,la cualiniciaelappleteneldepuradordeJava,jdb.SedebecompilarelcdigoJavaconlaopcin gparavisualizarelcdigofuenteeneldepurador. appletviewer [-debug] URLs... La referencia al applet contenida en el fichero HTML es una etiqueta HTML que especifica el cdigoacargarporelappletviewer,porejemplo: <APPLET CODE=HelloWorld.class WIDTH=100 HEIGHT=100></APPLET>
LAETIQUETAAPPLET
Lasintaxiscompletedelaetiquetaappletpuedeverseenelcdigosiguiente: <applet [archive=archiveList]Esteatributoopcionaldescribeunoomsarchivosque contienen clases y otros recursos que se precargan. Las clases se cargan usando una instanciadeunAppletClassLoaderconelcodebaseespecificado.Losarchivosen archiveListseseparanconunacoma. Code=appletFile.class Este atributo requerido especifica el nombre del ficheroquecontienelasubclasedeAppletcompilada,lacualpuedeespecificarseenel formato packge.appletFile.class. Este fichero es relativo a la URL base del fichero HTML que se est cargando. No puede incluir nombres de directorios. Para cambiarlaURLbasedelapplet,seusalaetiqueta<codebase>. width=pixels height=pixels Estos atributos requeridos dan el ancho y el alto inicial (en pxeles) del rea de despliegue del applet, sin incluir Windows ni Dialogsqueelappletpuedadesplegar. [codebase=codebaseURL] Este atributo opcional especifica la URL base del applet, es decir, el directorio que contiene el cdigo del applet. Si este atributo no se especifica,seutilizaelURLdeldocumentoHTML. [alt=alternateText] Este atributo opcional especifica qu texto desplegar si el navegadorpuedeleerlaetiquetaappletperonopuedeejecutarappletsJava. [name=appletInstanceName] Este atributo opcional especifica un nombre para la instancia del applet, posibitando que applets en la misma pgina se encuentren y comuniquenconl. [align=alignment] Este atributo opcional especifica la alineacin del applet. Los valoresposiblesparaesteatributosonlosmismosquelosdelaetiquetaIMGenHTML bsico: left, right, bottom, absbottom, top, texttop, middle, absmiddle,baseline. [vspace=pixels] [hspace=pixels] Este atributo opcional especifica el nmero de pxeles encima y debajo del applet (vspace) y a cada lado (hspace). Los valores se tratan de la misma manera que los atributos vspace y hspace de la etiquetaIMG. > [param name=appletAtribute1 value=value>] [<param name=appletAtribute1 value=value>] 7
Esta etiqueta da al applet un valor desde fuera, dando el mismo propsito funcionalquetienenlosargumentosdelalneadecomandosparaunaaplicacinJava. LosappletsaccedenasusatributosconelmtodogetParameter. [alternateHTML] Los navegadores que no son capaces de ejecutar programas Java despliegan el cdigo HTML incluido entre las etiquetas <APPLET> y </APPLET>;losnavegadoressoncapacesdesoportarlatecnologaignoran elcdigo HTMLentreestasdosetiquetas.
</applet>
ELEMENTOSADICIONALESDELOSAPPLETS
Otros elementos estn disponibles en un applet. Por ejemplo, los applets tienen mtodos que les permiten determinar informacin acerca del entorno del navegador donde se ha iniciado. La clase java.net.URL describe URLs, y se puede usar para conectarse a ellas. Se muestran 2 mtodos en la clase Applet que determinan el valor de URLs significativas, as comolosotrosdosquesirvenparaincluirsonidoseimgenesenunapplet. getDocumentBase: Devuelve un objeto URL que describe el directorio de la pgina actualdelnavegador,donderesideelficheroHTMLconlaetiquetaapplet. getCodeBase: Devuelve un objeto URL que describe el directorio fuente del fichero de la clase Applet. Frecuentemente es el mismo que el directorio del fichero HTML, peronosiempreesas. getImage(URL base, String target): Extrae una imagen del fichero indicadoportargetlocalizadoenelURLespecificadoporbase.Elvalordevueltoes unainstanciadelaclaseImage. getAudioClip(URL base, String target): Extrae un sonido del fichero indicadoportargetlocalizadoenelURLespecificadoporbase.Elvalordevueltoes unainstanciadelaclaseAudioClip.
EJEMPLOSENCILLODEDESPLIEGUEDEIMAGEN
El applet siguiente localiza y despliega el fichero imagen graphics/surferDuke.gif relativo al directorioactual,queesobtenidoporlaejecucindelmtodogetDocumentBase(). import java.awt.*; import java.applet.Applet; public class HwImage extends Applet{ Image duke; public void init(){ duke = getImage(getDocumentBase(), graphics/surferDuke.gif); } public void paint(Graphics g){ g.drawImage(duke, 25, 25, this); } } Una imagen que se carga por getImage cambia a lo largo del tiempo despus de la primera invocacin. Esto se debe a que la carga se hace de manera asncrona. A medida que se avanza 8
lacargadeelementosdelaimagen,seinvocadenuevoalmtodopaint.Estainvocacindel mtodo paint se hace porque el applet se registr como observador cuando se pas l mismocomocuartoargumentodedrawImage.
AUDIOCLIPS
El lenguaje de programacin Java ofrece tambin mtodos para reproducir sonidos, los cuales estn en la clase java.applet.AudioClip. Obviamente, se necesitar en el ordenador delusuarioelhardwareapropiadoparareproduciresossonidos.
Reproduccindeunsonido
La manera ms fcil de escuchar un sonido es usando alguno de los mtodosplay dela clase Applet: play(URL sondDirectory, String soundFile) play(URL sondURL)
Por ejemplo, play(getDocumentBase(), bark.ou), reproduce bark.au, que est enelmismodirectorioqueelficheroHTML. El siguiente applet imprime el mensaje Audio Test en el appletviewer y reproduce el fichero deaudiocuckoo.audeldirectoriosounds. import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.applet.Applet; public class HwAudio extends Applet{ public void init(){ addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ play(getCodeBase(), sounds/cuckoo.au); } }); } public void paint(Graphics g){ g.drawString(Audio Test, 25, 25); } }
REPRODUCCINREPETIDODEUNAUDIOCLIP
Lossonidossepuedencargarcomolasimgenes;esdecir,sepuedencargaryserreproducidas en otro momento. Para cargar un audio clip, se usa el mtodo getAudioClip de la clase java.applet.Applet. AudioClip sound; Sound = getAudioClip(getDocumentBase(), bark.au); Despus de cargarse, se usa uno de los tres mtodos asociados con el clip: play, loop o stop. El mtodo play de la interface java.applet.AudioClip se usa para reproducir unanicavezunsonidocargado. sound.play();
Parareproducirindefinidamenteunsonido(reproduccinautomtica),seusaelmtodoloop dejava.applet.AudioClip. sound.loop(); Para detener la reproduccin de un sonido, se usa el mtodo stop de java.applet.AudioClip. sound.stop();
EJEMPLODEREPRODUCCINREPETIDADEUNSONIDO
Elejemplosiguienterepiteindefinidamentelareproduccindeunsonido. import java.awt.Graphics; import java.applet.*; public class HwLoop extends Applet{ AudioClip sound; public void init(){ sound = getAudioClip(getCodeBase(), sounds/cuk.au); } public void paint(){ g.drawString(Audio Test, 25, 25); } } Java2SDKsoportaunmotordesonidosqueproveereproduccindeficherosMIDI,wav,aiffy au. Usando el mtodo newAudioClip(URL url) se recupera un sonido de la URL especificada.EnelejemploanteriorsepuedereemplazarelmtodogetAudioClipporeste mtodo,nonecesitandoningnsegundoparmetro,slolaURLdondeestelsonidoaemitir.
ENTRADASDELRATN
Una de las caractersticas ms importantes soportadas por el lenguaje Java es interactividad directa. Un applet Java, al igual que una aplicacin, puede prestar atencin al ratn y reaccionaraeventosdelratn. Las clases que implementan MouseListener reciben los eventos del ratn, y estos eventos puedenser: mouseClicked: El ratn ha sido pulsado (se ha presionado el botn del ratn y se hasoltadoenunmovimiento). mouseEntered:Elcursordelratnentraenuncomponente. mouseExited:Elcursordelratnsaledeuncomponente. mousePressed:Elcursordelratnhasidopresionado. mouseReleased:Elcursordelratnhasidosoltadotraspresionarse.
PRUEBASENCILLACONELRATN
El programa siguiente despliega las coordenadas del sitio donde se ha pulsado con el ratn dentrodelapplet. import java.awt.Graphics; 10
import java.awt.event.*; import java.applet.Applet; public class HwMouse extends Applet{ private int mouseX = 25; private int mouseY = 25; public void init(){ addMouseListener(new MouseHandler()); } public void paint(Graphics g){ g.drawString(Hello world!, mouseX, mouseY); } private class MouseHandler extends MouseAdapter{ public void mousePressed(MouseEvent evt){ mouseX = evt.getX(); mouseY = evt.getY(); repaint(); } } }
LECTURADEPARMETROS
En un fichero HTML, una etiqueta <param> en un contexto <applet> puede pasar informacindeconfiguracinalapplet.Porejemplo: <html> <applet code=Parameters.class width=200 height=200> <param name=speed value=12> <param name=distance value=500> </applet> </html> Al usar getParameter(nombre), si el nombre del parmetro no se puede encontrar en ninguna etiqueta <param> dentro del par <applet> </applet>, getParameter devuelve null, lo cual se debe prever adecuadamente. El tipo del valor del parmetro es siempreString.Sisedeseaotrotiposedebeconvertir. import java.applet.Applet; import java.awt.Graphics; public class Parameters extends Applet{ private String toDisplay; private int speed; public void init(){ String pv = getParameter(speed); if (pv == null) speed = 10; else speed = Integer.parseInt(pv); toDisplay = Speed given: + speed; }
11
public void paint(Graphics g){ g.drawString(toDisplay, 25, 25); } }
Enlosnombresdelosparmetrosnosediferenciaentremaysculasyminsculasporqueesla naturaleza de HTML; sin embargo, se recomienda colocarlos completamente en maysculas o enminsculas.Enlascadenasdevaloresssediferenciaentremaysculasyminsculas.
12