Applets

    Els applets són una de les particularitats de Java que contribueixen al seu gran èxit. Permeten carregar a través de la xarxa una aplicació portable que s'executarà al seu navegador (no a la màquina servidora de pàgines web).

    Diferències entre applet i aplicació:
     

  • Són carregats mitjançant el navegador, y no són executats directament pel núcli Java.
  • Es carreguen a través de la xarxa per mitjà de les pagines html, i no resideixen al disc dur de la màquina que els executa.
  • El seu cicle de vida és diferent. Una aplicació s'executa una vegada, mentres que un applet s'inicialitza i arrenca, i es torna a arrencar cada vegada que l'usuari recarrega la pàgina on es troba l'applet.
  • Per raons de seguretat, tenen menys drets que una aplicació clàssica. De manera predeterminada, a la màquina que els executa, no poden llegir ni escriure fitxers, ni executar programes, ni carregar dll. Només poden comunicar amb el servidor des d'on han surtit.

  •  

     

    Els applets són cridats a partir d'una font html llegida a distància pel seu navegador. El codi html que indica que ha de carregar-se un applet és el següent:
     
    <APPLET CODE="nom.class" WIDTH=200 HEIGHT=200 ALIGN=MIDDLE> 
    <PARAM NAME=elNom VALUE="Un exemple"> 
    </APPLET>

    CODE: Dóna el nom de la classe que s'ha de carregar per a arrencar l'applet.
    WIDTH HEIGHT: Indiquen sobre quin espai es visualitzarà l'applet.
    ALIGN: Indica el tipus d'alineació.
    PARAM NAME: Permet precisar tants paràmetres com es vulgui  a l'applet. Aquests paràmetres es recuperen al cos de l'applet amb el mètode getParameter(String s).

    Els applets no tenen mètode main. Quan el navegador arrenca un applet, busca la classe amb el nom que s'indica a la font html. Aquesta ha d'eheretar de la classe Applet. No es necessari definir un mètode main(), pel contrari, el navegador cridarà automàticament alguns dels mètodes de la classe Applet:
     

  • Constructor de la classe que hereda d'Applet, cridat en primera instància.
  • init(), cridat despres.
  • start(), cridat despres d'init(), i cridat cada vegada que l'applet ha sigut aturat. Això succeeix quan es canvia de pàgina web o es minimitza el navegador.
  • stop(), cridat just en els casos anteriors.
  • destroy(), cridat quan l'usuari abandona el navegador.
  • paint(), cridat cada vegada que s'ha de redibuixar el navegador.

  •  

     
     
     

    Quan creem el nostre applet, hem de redefinir tot o part d'aquests mètodes. paint(), especialment, proporciona el seu aspecte a l'applet. Aquest mètode és cridat passant-li com a paràmetre un objecte Graphics. Aquest és proporciona pel sistema, i el podem utilitzar sense preocupar-nos del seu origen.

    Si desitgem cridar a paint() des d'un altre mètode de l'applet, podem fer-ho gràcies al mètode repaint(), que crida a paint() proporcionant-li el paràmetre idoni.


     Un exemple senzill.

    L'exemple consisteix a redefinir els mètodes citats anteriorment fent que per a cadascún d'ells afegeixi el seu nom en una taula d'String, que així conservarà la memòria de les crides efectuades.
     
    import java.applet.*;
    import java.awt.*;
    import java.util.*;

    public class cicle extends Applet
     {
      // la taula on s'enmagatzemaran els noms dels mètodes cridats
      Vector lesCrides = null;

      public void paint(Graphics g)
      {
         int yactual=20;
       g.drawString("Crides als mètodes:", 20, yactual);
       yactual=yactual+15;
       lesCrides.addElement("Paint");
       for (Enumeration e=lesCrides.elements(); e.hasMoreElements(); )
       {
        g.drawString(e.nextElement().toString(), 20, yactual);
        yactual=yactual+15;
       }
      }

     public cicle()//constructor
      {
       lesCrides = new Vector();
       lesCrides.addElement("Constructor");
      }

     public void init()
      {
       lesCrides.addElement("Init");
      }

     public void start()
      {
       lesCrides.addElement("Start");
      }

     public void destroy()
      {
       lesCrides.addElement("Destroy");
      }

     public void stop()
      {
       lesCrides.addElement("Stop");
      }
     }

    La plana html que ens permet carregar l'applet, contindrà:
     
    <APPLET CODE="cicle.class" WIDTH=400 HEIGHT=200 ALIGN=MIDDLE> </APPLET>

    Ara ja només cal cridar la pàgina, i aquesta ens mostrarà l'applet en funcionament (previa compilació de l'applet javac cicle.java)

    Per a depurar un applet, podem utilitzar l'eina appletviewer que ens ofereix jdk. Per a utilitzar-a utilitzarem:
    Appletviewer cicle.html. (suposant que la plana html creada que conté la crida a l'applet es diu cicle.html).


    exercici: fixa't en els exemples dels jocs TicTacToe i Mastermind, per a crear el teu propi joc. Pots utilitzar les mateixes imatgesi sons que s'han utilitzat en els exemples.



    Tic Tac Toe

    Hem d'utilitzar dues variables Image que continguin els fitxers on tenim les images:

    Image notImage;
    Image crossImage;

    Inicialitzem l'applet.

    public void init()
        {
            notImage = getImage(getCodeBase(), "images/not.gif");
            crossImage = getImage(getCodeBase(), "images/cross.gif");
        }

    Per dibuixar l'aplet utilitzem el mètode paint.

    public void paint(Graphics g)
        {
         li hem d'indicar que dibuixarem (les linies de les nou caselles, imatges segons l'estat del joc,...)
        }

    Hem de controlar que fer quan es detecta un clic dins l'applet

    public boolean mouseUp(Event evt, int x, int y)
        {
        }

    Quan volguem utilitzar un so, utilitzarem:

    play(getCodeBase(), "audio/beep.au");

    Per col.locar una imatge, utilitzarem:

    g.drawImage(notImage, x, y, this);
    g.drawImage(crossImage, x, y, this);
     

    Mastermind

    En aquest cas les imatges es creen amb les funcions apropiades.
    g.fillOval(x,y,r,r), g.setColor(c), g.drawOval(x,y,r,r), fixDisc(g,x+3,y+3,6,Color.white), g.drawArc(x+4,y+4,9,9,-135,180)

    public final class mastermind extends java.applet.Applet
    {
     public void init()
     {
     Creem les imatges (es pot optar per carregar els fitxers amb les imatges ja creades)
     }

     public void clearBoard()  // Reset all variables and prepare for game
     {
      Reiniciem les variables i les figures amb repaint()
     }

     public boolean mouseDown(java.awt.Event evt, int x, int y)
     {
      A partir del events del mouse, realitzem les accions adequades
     }

     public void paint(Graphics g)
     {
     Dibuixem els elements del joc
     }
    }
     


    Veure solucions