JoggleApplet.java

import java.util.*;
import java.awt.*;
import java.applet.*;
public class JoggleApplet extends Applet implements Runnable {
  boolean hasBall;      // Vrai si l'applette a la balle
  Thread joggler;       // Processus léger responsable du jonglage
  /** 
   * Méthodes d'implantation de l'interface Joggle.
   */
  public void takeBall() {
    hasBall = true;
    repaint(); // Appel asynchrone de paint()
  }
  /**
   * Gère la transmission et la perte de la balle. Pour chaque
   * applette du même contexte (différente d'elle-même), transmet
   * la balle à cette applette.
   */
  public void joggle() {
    //  Si l'applette n'a pas la balle, elle ne fait rien.
    if (!hasBall) return;
    // Récupération du contexte courant
    AppletContext ctxt;  
    ctxt = getAppletContext();
    // Envoie la balle à chaque applette  du contexte
    for (Enumeration en = ctxt.getApplets(); en.hasMoreElements();) {
      Applet app = (Applet)en.nextElement();
      // Si app implante Joggle et est différente de l'applette courante
      if ((app instanceof JoggleApplet) && (!equals(app))) {
        // L'applette courante perd la balle
        hasBall=false;
    repaint();
        ((JoggleApplet) app).takeBall(); // Passe la balle à app
    return;
      }
    }
  }
  /** 
   * Récupère la paramètre "hasBall" dans le document HTML hébergeant
   * l'applette. Vrai si le paramètre est à "yes" et faux sinon.
   */
  public void init() {
    hasBall = "yes".equals(getParameter("ball"));
  }
  /** 
   * Dessin du contenu graphique de l'applette.
   */
  public void paint(Graphics gc) {
    if (hasBall) gc.drawString("balle",20,10);
    else gc.drawString("-----",20,10);
  }
  /** 
   * Création et démarrage d'un processus léger de jonglage.
   */
  public void start() {
    joggler = new Thread(this);
    joggler.start();
  }
  /** 
   * Demande d'arrêt du processus léger de jonglage.
   */
  public void stop() {
    joggler.interrupt();
  }
  /** 
   * Le processus léger appelle périodiquement la méthode joggle()
   * et redessine la fenêtre de l'applette.
   */
  public void run() {
    try {
      Thread t = Thread.currentThread();
      while (joggler == t) {
    t.sleep(1000);
    joggle();
      }
    } catch (InterruptedException e) { }
  }  
  public String getAppletInfo() {
    return "Applet Joggle. E. Duris.";
  }
}