Dans cette fiche... |
Difficulté : ![]() ![]() ![]() |
Résultat |
Dans les fiches précédentes, nous avons vu comment 2
applets pouvaient s'échanger des informations, via l'objet AppletContext
et ses méthodes getApplet() ou getApplets().
Problème : si les 2 applets sont placées sur 2 frames HTML différentes, elles ne partagent plus le même "contexte", donc l'objet AppletContext devient inexploitable. |
Cliquez ici pour afficher l'exemple |
Une technique possible : nous allons recréer un
AppletContext manuellement. Notre AppletContext s'appellera par exemple
AppletManager, et servira uniquement à tenir à jour une liste
des applets présentes à l'écran.
Pour que l'AppletManager soit partagé par toutes les applets, il faut en faire
un objet static.
A partir de là, il est possible d'obtenir une liste de toutes les applets présentes, via l'AppletManager.
L'objet AppletManager gère les applets dans une Hashtable.
Il comporte donc des méthodes pour ajouter, supprimer, rechercher un objet
(applet) stocké.
Les méthodes sont le plus simplifiées possibles; certains tests pourraient
être ajoutés.
// -------------------------------------------------- // GESTIONNAIRE D'APPLETS // --------------------------------------------------
import java.applet.Applet; import java.util.*;
public class AppletManager extends Object { // Liste des applets en cours static Hashtable hApplets = new Hashtable();
// Ajouter une applet à la liste static void add(Applet a, String s) { hApplets.put(s, a); }
// Supprimer une applet de la liste static void remove(String s) { hApplets.remove(s); }
// Obtenir une applet par son nom static Applet getApplet(String s) { return (Applet)hApplets.get(s); }
// Obtenir les noms des applets enregistrées static Enumeration getApplets() { return hApplets.keys(); }
// Compter le nombre d'applets static int count() { return hApplets.size(); } }
L'objet AppletManager est un objet simple, pas une applet. Il fait référence aux objets suivants :
Toutes ces notions n'ont pas encore été abordées sur ce site. Les lignes qui suivent seront donc encore nébuleuses si vous débutez !
import java.applet.Applet; |
L'objet AppletManager est un objet simple (il dérive
directement de la classe Object). L'importation du package java.applet n'a d'intérêt que parce nous souhaitons manipuler des objets Applet à l'intérieur de l'AppletManager. |
static Hashtable hApplets = new Hashtable(); |
Cette hashtable (table de hash ?!) est initalisée pour
l'instant à vide. Elle servira à contenir chaque applet présente à
l'écran, en y faisant référence par un nom. La hashtable est déclarée en static, de façon à pouvoir être mise à jour depuis n'importe quelle applet. |
static void add(Applet a, String s) { hApplets.put(s, a); } |
C'est cette fonction add() qui permet à une applet de
s'inscrire auprès de l'AppletManager. Notre fonction add() fait un applet à la méthode put() de la hashtable, qui stocke un objet a en lui associant un nom (une clef) s.
L'appel de cette fonction se fera au moment de l'initialisation de l'applet, par exemple par : public void init() { AppletManager.add(this, "essai"); } |
static void remove(String s) { hApplets.remove(s); } |
Une fonction pour supprimer une applet de la liste (d'après
son nom s). L'applet est simplement supprimée de la hashtable, grâce à la méthode remove() de l'objet Hashtable. L'appel de cette fonction se fera au moment de la destruction de l'applet, par exemple par : public void destroy() { AppletManager.remove("essai"); } |
static Applet getApplet(String s) { return (Applet)hApplets.get(s); } |
Notre fonction getApplet() renvoie l'objet Applet
correspondant au nom s. Rappel sur les hashtables : la méthode get() renvoie un objet générique. Il faut donc en faire une conversion (cast), pour obtenir un objet Applet. D'où le (Applet) en début de ligne. |
static Enumeration getApplets() { return hApplets.keys(); } |
Cette méthode fournit une énumération de tous les noms d'applets stockés dans
l'AppletManager. Attention : contrairement à AppletContext (qui renvoie des objets Applet), cette méthode renvoie uniquement les noms des applets (sous forme d'objets String). |
static int count() { return hApplets.size(); } |
Cette méthode donne le nombre d'applets présentes à l'écran, en lisant simplement la taille de la hashtable. |
Cette applet se référence elle-même auprès de l'AppletManager, et liste toutes les applets présentes à l'écran. En plaçant plusieurs AppletListers sur la page HTML, on voit comment évolue l'AppletManager en fonction du chargements des frames HTML.
// -------------------------------------------------- // APPLETLISTER : LISTE DES APPLETS TROUVEES, // AVEC OU SANS FRAMES // --------------------------------------------------
import java.applet.*; import java.awt.*; import java.util.*;
public class AppletLister extends Applet { // Le nom de cette applet String NomApplet;
// -------------------------------------------------- // GESTION DE L'APPLET // --------------------------------------------------
public void init() { NomApplet = getParameter("NAME"); AppletManager.add(this, NomApplet); }
public void destroy() { AppletManager.remove(NomApplet); }
// -------------------------------------------------- // AFFICHAGE // --------------------------------------------------
public void paint(Graphics g) { g.setColor(Color.black); g.fillRect(0, 0, size().width, size().height);
// Afficher le nom de cette applet g.setColor(Color.yellow); g.drawString("Applet " + NomApplet, 10, 15);
// Afficher le nombre d'applets stockées dans AppletManager g.setColor(Color.white); g.drawString("Applets=" + AppletManager.count(), 10, 30);
// Lister les noms des applets Enumeration e = AppletManager.getApplets(); int i = 45; while (e.hasMoreElements()) { g.drawString((String)e.nextElement(), 10, i); i += 15; }
// Réafficher dans 200 millisecondes repaint(200); } }
Seules les nouveautés sont traitées ci-dessous, comme d'habitude !
La notion d'énumération (plus bas) est détaillée sur la fiche Enumérations.
String NomApplet; |
Cette variable NomApplet servira simplement
à stocker le nom de l'applet. Pour plus de souplesse, on suppose que ce nom est passé en paramètre par la page HTML. |
public void init() { NomApplet = getParameter("NAME"); AppletManager.add(this, NomApplet); } |
Au démarrage de l'applet, celle-ci commence par lire son
nom, défini par la page HTML. Ensuite, elle se référence auprès d% l'AppletManager. |
public void destroy() { AppletManager.remove(NomApplet); } |
Inversement, au moment de sa destruction, l'applet met à
jour l'AppletManager en s'enlevant de la liste des applets présentes. Rappel : la méthode destroy() est appelée automatiquement quand l'applet disparaît (ce qui signifie qu'on quitte le navigateur, ou qu'on passe à une autre page, une autre frame). |
g.drawString("Applets=" + AppletManager.count(), 10, 30); |
On affiche le nombre d'applets actuellement référencées, grâce à la méthode count() de l'AppletManager. |
Enumeration e = AppletManager.getApplets(); |
On récupère ici, dans l'énumération e, les noms de toutes
les applets présentes actuellement dans l'AppletManager. La boucle plus bas sert à afficher la liste de ces noms (en parcourant l'énumération). |
repaint(200); |
On demande ici de redessiner l'applet dans 200 millisecondes,
de façon à interroger à nouveau l'AppletManager, pour vérifier si
d'autres applet s'y sont référencées..
Il serait plus judicieux d'utiliser des threads et du double buffering
pour améliorer ce traitement. |
Voici le code qui a été utilisé dans cette page HTML pour faire apparaître l'applet :
<applet code="AppletLister.class" width=250 height=100> <param name="NAME" value="ALPHA"> Votre navigateur n'est pas compatible Java ! </applet>
Pour l'exemple, l'applet a été placée plusieurs fois sur la page, avec un paramètre NAME différent à chaque fois.
Pour plus de précisions sur l'intégration d'une applet, cliquez ici.