Dans cette fiche...

<Retour>

Description de l'applet

Difficulté : Résultat
 

Sur le même principe que la fiche précédente, voici un exemple sur la communication des applets.

L'applet du bas charge une image, mais ne l'affiche pas.
Quand vous survolez l'applet du haut à la souris, l'image s'affiche dans l'applet du bas.

 

Votre navigateur n'est pas compatible Java !

Votre navigateur n'est pas compatible Java !

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 (AfficheImage.java)

// --------------------------------------------------
// AFFICHAGE D'IMAGE
// --------------------------------------------------
import java.applet.*;
import java.awt.*;
public class AfficheImage extends Applet
{
	Image im;
	MediaTracker mt = null;
	public boolean afficher = false;
	// Initialisation de l'applet
	public void init()
	{
		// Chargement de l'image
		im = getImage(getDocumentBase(), "smiley.gif");
		// Attendre le chargement
		MediaTracker mt = new MediaTracker(this);
		mt.addImage(im, 0);
		try
		{
			mt.waitForAll();
		} catch (Exception e) {}
	}
	// Affichage
	public void paint(Graphics g)
	{
		// Tracer un rectangle blanc (fond de l'applet)
		g.setColor(Color.white);
		g.fillRect(0, 0, size().width, size().height);		
		// Affichage de l'image
		if (afficher)
			g.drawImage(im, 0, 0, this);
	}
}

Le listing en détail...

Cette applet se contente de charger une image.
Si vous souhaitez des précisions sur le chargement des images, sur l'attente du chargement des images, consultez les fiches suivantes :

Quelques points importants :

Listing de l'applet principale (GereImage.java)

// --------------------------------------------------
// GEREIMAGE : COMMUNICATION ENTRE APPLETS
// --------------------------------------------------
import java.applet.*;
import java.awt.*;
public class GereImage extends Applet
{
	// Initialisation de l'applet
	public void init()
	{
		setBackground(Color.black);
	}
	// Affichage
	public void paint(Graphics g)
	{
		g.setColor(Color.white);
		g.drawString("Survolez l'applet à la souris...", 10, 15);		
	}
	// La souris entre dans l'applet
	public boolean mouseEnter(Event e, int x, int y)
	{
		AfficheImage ai;
		ai = (AfficheImage)getAppletContext().getApplet("AFFIM");
		if (ai != null)
		{
			ai.afficher = true;
			ai.repaint();
		}
		return true;
	}
	
	// La souris sort de l'applet
	public boolean mouseExit(Event e, int x, int y)
	{
		AfficheImage ai;
		ai = (AfficheImage)getAppletContext().getApplet("AFFIM");
		if (ai != null)
		{
			ai.afficher = false;
			ai.repaint();
		}
		return true;
	}
}

Le listing en détail...

Seules les nouveautés sont traitées ci-dessous, comme d'habitude !

public boolean mouseEnter(Event e, int x, int y)
{
	...
	return true;
}
Dans ce bloc, on réagit au fait que la souris entre dans l'applet (mouseEnter).
Pour plus de détails sur la gestion de la souris, reportez-vous aux fiches Déplacement de la souris et suivantes.
De même, plus loin, pour l'événement mouseExit().
 
AfficheImage ai;
On définit un objet AfficheImage, qui va représenter l'autre applet.
 
ai = (AfficheImage)getAppletContext().getApplet("AFFIM");
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 AFFIM (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();
ai = (AfficheImage)ac.getApplet("AFFIM");

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 AfficheImage. D'où le cast (conversion, en français) qui débute la ligne entre parenthères :
    ai = (AfficheImage)getAppletContext().getApplet("AFFIM");
 
if (ai != null)
{
	ai.afficher = false;
	ai.repaint();
}
Si l'applet n'a pas été trouvée, on positionne sa variable afficher à false, ce qui signifie : si la souris sort de l'applet principale, effacer l'image dans l'applet secondaire.
La mise à jour de l'applet secondaire ne se fera pas automatiquement, d'où le repaint() qui force le réaffichage.

2 choses intéressantes :

  • Une fois qu'on a identifié la seconde applet, on peut manipuler ses variables publiques "à distance"
  • On peut, sur le même principe, appeler ses méthodes publiques (comme repaint()).

Le bloc mouseEnter() fait l'inverse, en demandant d'afficher l'image quand la souris entre dans l'applet principale.

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 (GereImage) :

<applet code="GereImage.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 (AfficheImage) :

<applet code="AfficheImage.class" width=175 height=50 name="AFFIM">
Votre navigateur n'est pas compatible Java !
</applet>

Notez le name="AFFIM" qui définit le nom de l'applet secondaire. Ce nom est utilisé pour retrouver l'applet dans ai = (AfficheImage)getAppletContext().getApplet("AFFIM");

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

Compilation des 2 applets

La compilation de l'applet secondaire (AfficheImage) ne pose pas de problème, puisque celle-ci est prévue pour fonctionner seule.

Par contre, l'applet GereImage fait référence à l'applet secondaire.

Il faut donc qu'à la compilation de GereImage vous indiquiez le chemin d'accès à l'applet compilée AfficheImage.class.
Ceci peut se faire sur PC par :

set classpath=%classpath%;.
javac GereImage.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 GereImage.java et AfficheImage.java (et qu'AfficheImage.java a déjà été compilée en AfficheImage.class).