Dans cette fiche...

  <Retour Java>  <Retour Compléments>

Description de l'applet

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. Votre navigateur n'est pas compatible Java ! Votre navigateur n'est pas compatible Java !

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.

Listing de l'applet secondaire

// --------------------------------------------------
// 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);
	}
}

Le listing en détail...

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 :

 

Listing de l'applet principale

// --------------------------------------------------
// 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);
	}
}

Le listing en détail...

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 :

AppletContext ac = getAppletContext();
ap = (AppletParams)ac.getApplet("applet2");

Notes :

  • Si l'applet cherchée n'existe pas (ou n'existe pas encore, en fonction du chargement de la page), la méthode getApplet() renvoie la valeur null.
  • La méthode getApplet() renvoie un objet Applet générique. Or nous devons manipuler un objet AppletParams. D'où le cast (conversion, en français) qui débute la ligne entre parenthères :
    ap = (AppletParams)getAppletContext().getApplet("applet2");
 
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 :

g.drawString("Nom (fourni par applet2) : " + ap.nom, 10, 15);
g.drawString("Age (fourni par applet2) : " + ap.age, 10, 30);

 
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.
Vous constaterez que dans certains cas, l'applet CommApplet2 ne détecte pas l'applet AppletParams au départ. Ceci s'explique par le fait qu'AppletParams n'est pas encore chargée ou initialisée (elle n'est pas référencée par getAppletContext()).
On demande donc à CommApplet2 de se redessiner régulièrement, et de réinterroger l'environnement pour savoir si AppletParams est "arrivée". Ouf !

On résoudrait le problème de façon plus élégante par les threads. Dans une prochaine fiche pratique !

 

Intégration des applets dans la page

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.

Compilation des 2 applets

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)