IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

 

Développons en Java   2.30  
Copyright (C) 1999-2022 Jean-Michel DOUDOUX    (date de publication : 15/06/2022)

[ Précédent ] [ Sommaire ] [ Suivant ] [Télécharger ]      [Accueil ]

 

84. Les applets

 

chapitre    8 4

 

Niveau : niveau 3 Intermédiaire 

niveau 3 Technologie legacy
Ce chapitre est conservé pour des raisons historiques

 

Une applet est un programme Java qui s'exécute dans un logiciel de navigation supportant Java ou dans l'appletviewer du JDK.

attention Il est recommandé de tester les applets avec l'appletviewer car les navigateurs peuvent prendre l'applet contenu dans leurs caches plutôt que la dernière version compilée.

Les applets ont historiquement permis de réaliser des animations dans les pages web avant de voir arriver d'autres solutions comme Flash.

stop

Attention : pour améliorer leur sécurité, les navigateurs modernes prévoient à terme de retirer le support des plugins de type NPAPI. Ceci conduit à l'arrêt du support de technologies reposant sur des plugins pour exécuter du code comme Flash, Silverlight et bien évidemment Java. Fin 2015, les principaux navigateurs ont annoncé l'arrêt ou une date de l'arrêt du support par les navigateurs. Les applications reposant sur des applets doivent envisager de migrer vers d'autres technologies supportées par les navigateurs.

Ainsi à partir de Java 9, l'API Applet est deprecated. Son éviction interviendra dans une version ultérieure de Java.


Ce chapitre contient plusieurs sections :

 

84.1. L'intégration d'applets dans une page HTML

Dans une page HTML, il faut utiliser le tag APPLET avec la syntaxe suivante :

<APPLET CODE=« Exemple.class » WIDTH=200 HEIGHT=300 > </APPLET>

Le nom de l'applet est indiqué entre guillemets à la suite du paramètre CODE.

Les paramètres WIDTH et HEIGHT fixent la taille de la fenêtre de l'applet dans la page HTML. L'unité est le pixel. Il est préférable de ne pas dépasser 640 * 480 (VGA standard).

Le tag APPLET peut comporter les attributs facultatifs suivants :

Tag Rôle
CODEBASE permet de spécifier le chemin relatif au dossier de la page contenant l'applet. Ce paramètre suit le paramètre CODE.

Exemple : CODE=nomApplet.class CODEBASE=/nomDossier

HSPACE et VSPACE permettent de fixer la distance en pixels entre l'applet et le texte
ALT affiche le texte spécifié par le paramètre lorsque le navigateur ne supporte pas Java ou que son support est désactivé.

Le tag PARAM permet de passer des paramètres à l'applet. Il doit être inclus entre les tags APPLET et /APPLET.

<PARAM nomParametre value=« valeurParametre »> </APPLET>

La valeur est toujours passée sous forme de chaîne de caractères donc entourée de guillemets.

Exemple : <APPLET code=« Exemple.class » width=200 height=300>

Le texte contenu entre <APPLET> et </APPLET> est affiché si le navigateur ne supporte pas java.

 

84.2. Les méthodes des applets

Le mécanisme d'initialisation d'une applet se fait en deux temps :

  1. la machine virtuelle Java instancie l'objet Applet en utilisant le constructeur par défaut
  2. la machine virtuelle Java envoie le message init() à l'objet Applet

Une classe dérivée de la classe java.applet.Applet hérite de méthodes qu'il faut redéfinir en fonction des besoins et doit être déclarée public pour fonctionner.

En général, il n'est pas nécessaire de faire un appel explicite aux méthodes init(), start(), stop() et destroy() : le navigateur se charge d'appeler ces méthodes en fonction de l'état de la page HTML contenant l'applet.

 

84.2.1. La méthode init()

Cette méthode permet l'initialisation de l'applet : elle n'est exécutée qu'une seule et unique fois après le chargement de l'applet.

 

84.2.2. La méthode start()

Cette méthode est appelée automatiquement après le chargement et l'initialisation (par la méthode init()) lors du premier affichage de l'applet.

 

84.2.3. La méthode stop()

Le navigateur appelle automatiquement la méthode lorsque l'on quitte la page HTML. Elle interrompt les traitements de tous les processus en cours.

 

84.2.4. La méthode destroy()

Elle est appelée après l'arrêt de l'applet ou lors de l'arrêt de la machine virtuelle. Elle libère les ressources et détruit les threads restants

 

84.2.5. La méthode update()

Elle est appelée à chaque rafraîchissement de l'écran ou appel de la méthode repaint(). Elle efface l'écran et appelle la méthode paint(). Ces actions provoquent souvent des scintillements. Il est préférable de redéfinir cette méthode pour qu'elle n'efface plus l'écran :

Exemple :
public void update(Graphics g) { paint (g);}

 

84.2.6. La méthode paint()

Cette méthode permet d'afficher le contenu de l'applet à l'écran. Ce rafraîchissement peut être provoqué par le navigateur ou par le système d'exploitation si l'ordre des fenêtres ou leur taille a été modifié ou si une fenêtre recouvre l'applet.

Exemple :
public void paint(Graphics g)

La méthode repaint() force l'utilisation de la méthode paint().

Il existe des méthodes dédiées à la gestion de la couleur de fond et de la couleur de premier plan

La méthode setBackground(Color), héritée de Component, permet de définir la couleur de fond d'une applet. Elle attend en paramètre un objet de la classe Color.

La méthode setForeground(Color) fixe la couleur d'affichage par défaut. Elle s'applique au texte et aux graphiques.

Les couleurs peuvent être spécifiées de trois manières différentes :

utiliser les noms standards prédéfinis Color.nomDeLaCouleur

Les noms prédéfinis de la classe Color sont : black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white, yellow

utiliser 3 nombres de type entier représentant le RGB

(Red,Green,Blue : rouge,vert, bleu)

Exemple :
Color macouleur = new Color(150,200,250);
setBackground (macouleur);
// ou setBackground(150,200,250);
utiliser 3 nombres de type float utilisant le système HSB

(Hue, Saturation, Brightness : teinte, saturation, luminance). Ce système est moins répandu que le RGB mais il permet notamment de modifier la luminance sans modifier les autres caractéristiques

Exemple :
setBackground(0.0,0.5,1.0);

dans ce cas 0.0,0.0,0.0 représente le noir et 1.0,1.0,1.0 représente le blanc.

 

84.2.7. Les méthodes size() et getSize()

L'origine des coordonnées en Java est le coin supérieur gauche. Elles s'expriment en pixels avec le type int.

La détermination des dimensions d'une applet se fait de la façon suivante :

Exemple ( code Java 1.0 ) :
Dimension dim = size();
int applargeur = dim.width;
int apphauteur = dim.height;

Avec le JDK 1.1, il faut utiliser getSize() à la place de size().

Exemple ( code Java 1.1 ) :
public void paint(Graphics g) {
   super.paint(g);
   Dimension dim = getSize();
   int applargeur = dim.width;
   int apphauteur = dim.height;
   g.drawString("width = "+applargeur,10,15);
   g.drawString("height = "+apphauteur,10,30);
}

 

84.2.8. Les méthodes getCodeBase() et getDocumentBase()

Ces méthodes renvoient respectivement l'emplacement de l'applet sous forme d'adresse Web ou de dossier et l'emplacement de la page HTML qui contient l'applet.

Exemple :
public void paint(Graphics g) {
   super.paint(g);
   g.drawString("CodeBase = "+getCodeBase(),10,15);
   g.drawString("DocumentBase = "+getDocumentBase(),10,30);
}

 

84.2.9. La méthode showStatus()

Affiche un message dans la barre de statut de l'applet

Exemple :
public void paint(Graphics g) {
   super.paint(g);
   showStatus("message à afficher dans la barre d'état");
}

 

84.2.10. La méthode getAppletInfo()

Permet de fournir des informations concernant l'auteur, la version et le copyright de l'applet

Exemple :
static final String appletInfo = " test applet : auteur, 1999 \n\nCommentaires";

public String getAppletInfo() {
   return appletInfo;
}

Pour voir les informations, il faut utiliser l'option info du menu Applet de l'appletviewer.

 

84.2.11. La méthode getParameterInfo()

Cette méthode permet de fournir des informations sur les paramètres reconnus par l'applet

Le format du tableau est le suivant :

{ {nom du paramètre, valeurs possibles, description} , ... }

Exemple :
static final String[][] parameterInfo = 
{ {"texte1", "texte1", " commentaires du texte 1" } ,
  {"texte2", "texte2", " commentaires du texte 2" } };

public String[][] getParameterInfo() {
   return parameterInfo;
}

Pour voir les informations, il faut utiliser l'option info du menu Applet de l'appletviewer.

 

84.2.12. La méthode getGraphics()

Elle retourne la zone graphique d'une applet : utile pour dessiner dans l'applet avec des méthodes qui ne reçoivent pas le contexte graphique en paramètres (ex : mouseDown() ou mouseDrag()).

 

84.2.13. La méthode getAppletContext()

Cette méthode permet l'accès à des fonctionnalités du navigateur.

 

84.2.14. La méthode setStub()

Cette méthode permet d'attacher l'applet au navigateur.

 

84.3. Les interfaces utiles pour les applets

 

84.3.1. L'interface Runnable

Cette interface fournit le comportement nécessaire à une applet pour devenir un thread.

Les méthodes start() et stop() de l'applet peuvent démarrer et arrêter un thread pour limiter l'usage des ressources machines lorsque la page contenant l'applet est inactive.

 

84.3.2. L'interface ActionListener

Cette interface permet à l'applet de répondre aux actions de l'utilisateur avec la souris

La méthode actionPerformed() définit les traitements associés aux événements.

Exemple ( code Java 1.1 ) :
public void actionPerformed(ActionEvent evt) { ... }

Pour plus d'information, voir le chapitre «L'interception des actions de l'utilisateur».

 

84.3.3. L'interface MouseListener pour répondre à un clic de souris

Exemple ( code Java 1.1 ) :
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class AppletMouse extends Applet implements MouseListener {
   int nbClick = 0;
   
   public void init() {
      super.init();
      addMouseListener(this);
   }

   public void mouseClicked(MouseEvent e) {
      nbClick++;
      repaint();
   }

   public void mouseEntered(MouseEvent e) {
   }

   public void mouseExited(MouseEvent e) {
   }
 
   public void mousePressed(MouseEvent e) {
   }
   
   public void mouseReleased(MouseEvent e) {
   }

   public void paint(Graphics g) {
      super.paint(g);
      g.drawString("Nombre de clics : " + nbClick, 10, 10);
   }

}

Pour plus d'information, voir le chapitre sur «L'interception des actions de l'utilisateur».

 

84.4. La transmission de paramètres à une applet

La méthode getParameter() retourne les paramètres écrits dans la page HTML. Elle retourne une chaîne de caractères de type String.

Exemple :
Sting parametre;
parametre = getParameter(" nom-parametre ");

Si le paramètre n'est pas renseigné dans la page HTML alors getParameter() retourne null

Pour utiliser les valeurs des paramètres, il sera souvent nécessaire de faire une conversion de la chaîne de caractères dans le type voulu en utilisant les Wrappers

Exemple :
String taille;
int hauteur;
taille = getParameter(" hauteur ");
Integer temp = new Integer(taille)
hauteur = temp.intValue();

 

Exemple :
int vitesse;
String paramvitesse = getParameter(" VITESSE ");
if (paramvitesse != null) vitesse = Integer.parseInt(paramVitesse);
// parseInt ne fonctionne pas avec une chaîne vide
stop Attention : l'appel à la méthode getParameter() dans le constructeur pas défaut lève une exception de type NullPointerException.

Exemple :
public MonApplet() {
   String taille;
   taille = getParameter(" message ");
}

 

84.5. Les applets et le multimédia

 

84.5.1. L'insertion d'images

Java supporte deux standards :

  • le format GIF de Compuserve qui est beaucoup utilisé sur internet car il génère des fichiers de petites tailles contenant des images d'au plus 256 couleurs.
  • et le format JPEG. qui convient mieux aux grandes images et à celles de plus de 256 couleurs car le taux de compression avec perte de qualité peut être précisé.

Pour la manipulation des images, le package nécessaire est java.awt.image.

La méthode getImage() possède deux signatures : getImage(URL url) et getImage (URL url, String name).

On procède en deux étapes : le chargement puis l'affichage. Si les paramètres fournis à getImage ne désignent pas une image, aucune exception n'est levée.

La méthode getImage() ne charge pas de données sur le poste client. Celles-ci seront chargées quand l'image sera dessinée pour la première fois.

Exemple :
public void paint(Graphics g) {
   super.paint(g);
   Image image=null;
   image=getImage(getDocumentBase( ), "monimage.gif"); //chargement de l'image

   g.drawImage(image, 40, 70, this);
}

Le sixième paramètre de la méthode drawImage() est un objet qui implémente l'interface ImageObserver. ImageObserver est une interface déclarée dans le package java.awt.image qui sert à donner des informations sur le fichier image. Souvent, on indique représentant l'applet elle-même this à la place de cet argument. La classe ImageObserver détecte le chargement et la fin de l'affichage d'une image. La classe Applet ce charge automatiquement de faire ces actions d'où le fait de mettre this.

Pour obtenir les dimensions de l'image à afficher on peut utiliser les méthodes getWidth() et getHeight() qui retourne un nombre entier en pixels.

Exemple :
int largeur = 0;
int hauteur = 0;
largeur = image.getWidth(this);
hauteur = image.getHeight(this);

 

84.5.2. L'utilisation des capacités audio

Seul le format d'extension .AU de Sun est supporté par Java. Pour utiliser un autre format, il faut le convertir.

La méthode play() permet de jouer un son.

Exemple :
import java.net.URL;

   ...
   try {
      play(new URL(getDocumentBase(), " monson.au "));
   } catch (java.net.MalformedURLException e) {}

La méthode getDocumentBase() détermine et renvoie l'URL de l'applet.

Ce mode d'exécution n'est valable que si le son n'est à reproduire qu'une seule fois, sinon il faut utiliser l'interface AudioClip.

Avec trois méthodes, l'interface AudioClip facilite l'utilisation des sons :

  • public abstract void play() // jouer une seule fois le fichier
  • public abstract void loop() // relancer le son jusqu'à interruption par la méthode stop ou la fin de l'applet
  • public abstract void stop() // fin de la reproduction du clip audio
Exemple :
import java.applet.*;
import java.awt.*;
import java.net.*;

public class AppletMusic extends Applet {
   protected AudioClip aC = null;

   public void init() {
      super.init();
      try {
      AppletContext ac = getAppletContext();
      if (ac != null)
         aC = ac.getAudioClip(new URL(getDocumentBase(), "spacemusic.au"));
      else
         System.out.println(" fichier son introuvable ");
    } catch (MalformedURLException e) {}
      aC.loop();
   }
}

Pour utiliser plusieurs sons dans une applet, il suffit de déclarer plusieurs variables AudioClip.

L'objet retourné par la méthode getAudioClip() est un objet qui implémente l'interface AudioClip définit dans la machine virtuelle car il est très dépendant du système de la plate-forme d'exécution.

 

84.5.3. L'animation d'un logo

Exemple :
import java.applet.*;
import java.awt.*;

public class AppletAnimation extends Applet implements Runnable {
   Thread thread;
   protected Image tabImage[];
   protected int index;

   public void init() {
      super.init();
      // chargement du tableau d'images

      index = 0;
      tabImage = new Image[2];
      for (int i = 0; i < tabImage.length; i++) {
         String fichier = new String("monimage" + (i + 1) + ".gif ");
         tabImage[i] = getImage(getDocumentBase(), fichier);
      }
   }

   public void paint(Graphics g) {
      super.paint(g);
      // affichage de l'image

      g.drawImage(tabImage[index], 10, 10, this);
   }

   public void run() {
      // traitements exécutés par le thread

      while (true) {
         repaint();
         index++;
         if (index >= tabImage.length)
            index = 0;
         try {
            thread.sleep(500);
      } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }

   public void start() {
      // démarrage du thread

      if (thread == null) {
         thread = new Thread(this);
         thread.start();
      }
   }

   public void stop() {
      // arrêt du thread

      if (thread != null) {
         thread.stop();
         thread = null;
      }
   }

   public void update(Graphics g) {
      // la redéfinition de la méthode permet d'éviter les scintillements

      paint(g);
   }

}

La surcharge de la méthode paint() permet d'éviter le scintillement dû à l'effacement de l'écran et à son rafraîchissement. Dans ce cas, seul le rafraîchissement est effectué.

 

84.6. Une applet pouvant s'exécuter comme une application

Il faut rajouter une classe main à l'applet, définir sa fenêtre d'affichage, appeler les méthodes init() et start() et afficher la fenêtre.

Exemple ( code Java 1.1 ) :
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class AppletApplication extends Applet implements WindowListener {

   public static void main(java.lang.String[] args) {
      AppletApplication applet = new AppletApplication();
      Frame frame = new Frame("Applet");
      frame.addWindowListener(applet);
      frame.add("Center", applet);
      frame.setSize(350, 250);
      frame.show();
      applet.init();
      applet.start();
   }

   public void paint(Graphics g) {
      super.paint(g);
      g.drawString("Bonjour", 10, 10);
   }

   public void windowActivated(WindowEvent e) { }

   public void windowClosed(WindowEvent e) { }

   public void windowClosing(WindowEvent e) {
      System.exit(0);
   }

   public void windowDeactivated(WindowEvent e) { }

   public void windowDeiconified(WindowEvent e) { }

   public void windowIconified(WindowEvent e) { }

   public void windowOpened(WindowEvent e) { }

}

 

84.7. Les droits des applets

Une applet est une application Java hébergée sur une machine distante (un serveur Web) et qui s'exécute, après chargement, sur la machine cliente équipée d'un navigateur. Ce navigateur contrôle les accès de l'applet aux ressources locales et ne les autorisent pas systématiquement : chaque navigateur définit sa propre règle.

Le modèle classique de sécurité pour l'exécution des applets, recommandé par Sun, distingue deux types d'applets : les applets non dignes de confiance (untrusted) qui n'ont pas accès aux ressources locales et externes, les applets dignes de confiance (trusted) qui ont l'accès. Dans ce modèle, une applet est par défaut untrusted.

La signature d'une applet permet de désigner son auteur et de garantir que le code chargé par le client est bien celui demandé au serveur. Cependant, une applet signée n'est pas forcément digne de confiance.

en construction
La suite de ce chapitre sera développée dans une version future de ce document

 


[ Précédent ] [ Sommaire ] [ Suivant ] [Télécharger ]      [Accueil ]

78 commentaires Donner une note à l´article (5)

 

Copyright (C) 1999-2022 Jean-Michel DOUDOUX. Vous pouvez copier, redistribuer et/ou modifier ce document selon les termes de la Licence de Documentation Libre GNU, Version 1.1 ou toute autre version ultérieure publiée par la Free Software Foundation; les Sections Invariantes étant constitués du chapitre Préambule, aucun Texte de Première de Couverture, et aucun Texte de Quatrième de Couverture. Une copie de la licence est incluse dans la section GNU FreeDocumentation Licence. La version la plus récente de cette licence est disponible à l'adresse : GNU Free Documentation Licence.