Dans cette fiche...

<Retour Java Base>       <Retour Compléments>

Description de l'applet

Difficulté : Résultat
Si vous souhaitez faire communiquer plusieurs applets entre elles, vous aurez peut-être besoin de détecter quelles sont les applets présentes dans votre page HTML.
Voici comment faire...

Vous aurez besoin de connaître le principe des énumérations pour cet exemple.

Votre navigateur n'est pas compatible Java !

Votre navigateur n'est pas compatible Java !

Listing de l'applet

// --------------------------------------------------
// LISTEAPPLETS : DETECTION DES APPLETS SUR LA PAGE
// --------------------------------------------------
import java.applet.*;
import java.awt.*;
import java.util.*;
public class ListeApplets extends Applet
{
	Enumeration e;  // Liste des applets trouvées
	Applet a;	// Une applet quelconque
	int NbApplets;	// Le nombre total d'applets
	// Initialisation de l'applet
	public void init()
	{
		setBackground(Color.black);
	}
	// Affichage
	public void paint(Graphics g)
	{
		// Les couleurs...
		g.setColor(Color.white);
		// Obtenir une énumération de toutes les applets de la page
		e = getAppletContext().getApplets();
		// Afficher les noms des applets
		NbApplets = 0;
		while (e.hasMoreElements())
		{
			// Compter une applet de plus
			NbApplets++;
			// Obtenir l'applet
			a = (Applet)e.nextElement();
			// Afficher le nom de l'applet
			g.drawString(a.getClass().toString(), 10, 15*NbApplets);
		}
		// Afficher le nombre d'applets
		g.setColor(Color.orange);
		g.drawString("La page contient : " + NbApplets + " applet(s)", 10, 15+15*NbApplets);
		// Demander un nouvel affichage de cette applet, dans 1 seconde
		repaint(1000);
	}
}

Le listing en détail...

Les lignes non commentées ont déjà été traitées dans les exemples précédents.

import java.util.*;
On importe le package java.util, pour pouvoir utiliser l'objet Enumeration.
 
Enumeration e;
Applet a;
int NbApplets;
On déclare :
  • un objet Enumeration (qui contiendra la liste des applets présentes sur la page),
  • un objet Applet (qui contiendra l'une des applets à un moment donné),
  • une variable entière NbApplets (qui servira simplement à compter les applets).
 
e = getAppletContext().getApplets();
On identifie l'environnement (ou le contexte) actuel de notre applet, par la méthode getAppletContext().
L'objet AppletContext ainsi créé possède la méthode getApplets() qui liste toutes les applets de la page, sous forme d'énumération.

On aurait pu écrire, en détaillant :

AppletContext ac = getAppletContext();
e = ac.getApplets();

Note : à la fin de cette opération, l'énumération e contient toutes les applets de la page, y compris celle dans laquelle on se trouve.

 
NbApplets = 0;
while (e.hasMoreElements())
{
	// Compter une applet de plus
	NbApplets++;
	...
}
Il ne reste plus qu'à afficher les applets trouvées, en les récupérant une à une dans l'énumération e.
La boucle se déroule tant que l'énumération contient des éléments supplémentaires (des applets).

Pour plus de détails sur les méthodes hasMoreElements() et nextElement(), consultez la fiche Enumérations.

 
a = (Applet)e.nextElement();
Rappel pratique sur l'objet Enumeration e : celui-ci fournit un objet générique (une classe Object, et non une classe Applet qui nous intéresse). Il faut donc convertir l'objet reçu en objet Applet, par un cast. D'où le (Applet) de début de ligne.
 
g.drawString(a.getClass().toString(), 10, 15*NbApplets);
La méthode getClass() donne la classe dont fait partie l'applet (la famille d'objets, en quelque sorte).
La méthode toString() permet ensuite le nom de la classe, sous forme de chaîne de caractères.

On aurait pu également écrire :

g.drawString(a.toString(), 10, 15*NbApplets);

pour obtenir une chaîne de caractères désignant l'applet, directement.
Vous verrez que cette chaînes n'est pas forcément très lisible (elle donne des informations supplémentaires sur l'applet).

 
repaint(1000);
On demande ici de redessiner l'applet ListeApplets dans 1 seconde (et donc une fois à chaque seconde)

Si vous supprimez cette ligne, vous constaterez que dans certains cas, l'applet ListeApplets ne détecte pas les autres applets de la page. Ceci s'explique par le fait que ces applets ne pas encore chargées ou initialisées (elles ne sont pas référencées par getAppletContext()).
On demande donc à ListeApplets de se redessiner régulièrement, et de réinterroger l'environnement pour savoir si d'autres applets sont "arrivées".

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

Intégration de l'applet dans la page

Voici le code qui a été utilisé dans cette page HTML pour faire apparaître l'applet :

<applet code="ListeApplets.class" width=250 height=50>
Votre navigateur n'est pas compatible Java !
</applet>

Une seconde applet (AppletParams.class) a été placée sur la page, pour montrer les effets de getApplets().

Pour plus de précisions sur l'intégration d'une applet, cliquez ici.