Dans cette fiche... |
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.
|
|
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.
// -------------------------------------------------- // 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); } }
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 :
// -------------------------------------------------- // 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; } }
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 :
Notes :
|
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 :
Le bloc mouseEnter() fait l'inverse, en demandant d'afficher l'image quand la souris entre dans l'applet principale. |
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.
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).