Dans cette fiche... |
Difficulté : ![]() ![]() |
Résultat |
Si 2 ou plusieurs applets figurent sur la même page HTML, elles partagent le même "contexte" (au sens Java). Elles peuvent donc communiquer les unes avec les autres. |
Dans l'exemple ci-dessus, l'applet de droite se contente de lire 2
paramètres (définis dans le code HTML), et de les afficher. Il s'agit d'une
variante de l'applet Parametres.class.
L'applet de gauche va lire ces 2 paramètres directement dans l'applet de
droite.
Attention : 2 applets situées dans des frames (cadres HTML)
ne partagent pas le même contexte.
La méthode expliquée ci-dessous n'est donc pas applicable dans ce cas.
// -------------------------------------------------- // LECTURE DE PARAMETRES EN JAVA // --------------------------------------------------
import java.applet.*; import java.awt.*;
public class AppletParams extends Applet { public String nom; public int age; String s1;
public void init() { // Couleur de fond de l'applet setBackground(Color.black);
// Lire le paramètre NOM, de type chaîne nom = getParameter("NOM");
// Lire le paramètre AGE, de type entier s1 = getParameter("AGE"); if (s1 == null) age = 0; else age = Integer.parseInt(s1); }
// On affiche tout ça ! public void paint(Graphics g) { g.setColor(Color.orange); g.drawString("Nom : " + nom, 10, 15); g.drawString("Age : " + age, 10, 30); } }
Ce listing a déjà été commenté en détail sur la fiche Lecture de paramètres.
Voici les quelques changements qui ont été effectués :
// -------------------------------------------------- // COMMAPPLET2 : COMMUNICATION ENTRE APPLETS // --------------------------------------------------
import java.applet.*; import java.awt.*;
public class CommApplet2 extends Applet { AppletParams ap; String nom; int age;
// Initialisation de l'applet public void init() { setBackground(Color.black); }
// Affichage public void paint(Graphics g) { // Les couleurs... g.setColor(Color.white);
// Identifier l'applet nommée "applet2" ap = (AppletParams)getAppletContext().getApplet("applet2");
// Erreur si l'applet n'a pas été trouvée if (ap == null) g.drawString("applet2 n'existe pas !", 10, 15); else { // Lire les valeurs stockées dans applet2 nom = ap.nom; age = ap.age;
// Afficher ! g.drawString("Nom (fourni par applet2) : " + nom, 10, 15); g.drawString("Age (fourni par applet2) : " + age, 10, 30); }
repaint(1000); } }
Seules les nouveautés sont traitées ci-dessous, comme d'habitude !
AppletParams ap; |
On déclare un objet de type AppletParams (qui désignera l'autre applet). |
String nom; int age; |
2 variables, qui serviront à stocker le nom et l'âge fournis par l'autre applet.. |
ap = (AppletParams)getAppletContext().getApplet("applet2"); |
La ligne la plus importante : on utilise la méthode getAppletContext()
qui donne l'environnement dans lequel se trouve l'applet. Une fois le "contexte" identifié, on peut utiliser la méthode getApplet(), qui permet de trouver une applet par son nom. On cherche ici l'applet nommée applet2 (le nom étant donné lors de l'intégration de l'applet dans la page HTML, voir plus bas). On aurait pu écrire, en détaillant :
Notes :
|
if (ap == null) g.drawString("applet2 n'existe pas !", 10, 15); else { // Lire les valeurs stockées dans applet2 nom = ap.nom; age = ap.age; // Afficher ! g.drawString("Nom (fourni par applet2) : " + nom, 10, 15); g.drawString("Age (fourni par applet2) : " + age, 10, 30); } |
Si l'applet n'a pas été trouvée, on affiche un message
d'erreur, sinon on va lire les 2 variables nom et age
de l'applet2 (rappel : ces 2 variables ont été déclarées publiques),
puis on affiche.
On pourrait bien sûr afficher directement les valeurs de l'objet applet2, par :
|
repaint(1000); |
On demande ici de redessiner l'applet CommApplet2 dans 1
seconde. A quoi bon ? Essayez de mettre cette ligne en commentaires, puis de recompiler
l'applet. On résoudrait le problème de façon plus élégante par les threads. Dans une prochaine fiche pratique ! |
Voici le code qui a été utilisé dans cette page HTML pour faire apparaître l'applet principale (CommApplet2) :
<applet code="CommApplet2.class" width=175 height=50> Votre navigateur n'est pas compatible Java ! </applet>
Voici le code qui a été utilisé dans cette page HTML pour faire apparaître l'applet secondaire (AppletParams) :
<applet code="AppletParams.class" width=75 height=50 name="applet2"> <param name="NOM" value="Bob"> <param name="AGE" value="30"> Votre navigateur n'est pas compatible Java ! </applet>
Notez le name="applet2" qui définit le nom de l'applet secondaire. Ce nom est utilisé pour retrouver l'applet dans ap = (AppletParams)getAppletContext().getApplet("applet2");
Pour plus de précisions sur l'intégration d'une applet, cliquez ici.
La compilation de l'applet secondaire (AppletParams) ne pose pas de problème, puisque celle-ci est prévue pour fonctionner seule.
Par contre, l'applet CommApplet2 fait référence à l'applet secondaire, par les lignes :
AppletParams ap;
nom = ap.nom;
age = ap.age;
Il faut donc qu'à la compilation de CommApplet2 vous indiquiez le chemin
d'accès à l'applet compilée AppletParams.class.
Ceci peut se faire sur PC par :
set classpath=%classpath%;. javac CommApplet2.java
En clair : on redéfinit le classpath
(donc le chemin d'accès aux classes Java), en reprenant l'ancien classpath, et
en y ajoutant le répertoire de travail.
Ceci suppose qu'on lance la compilation dans le répertoire qui contient les 2
listings CommApplet.java et AppletParams.java (et qu'AppletParams a déjà été
compilée en AppletParams.class).
Bon, prenez une aspirine, allez vous coucher, et revenez plus tard :o)