next up previous
Next: 4.3 Relation entre ControlLayer Up: 4 Composition - Structure Previous: 4.1 Présentation

4.2 Couches de contrôle et d'interface graphique: détail

Lorsqu'on lance l'application, on lance en fait la méthode main() de l'objet implémentant la couche de contrôle, à savoir ControlLayer pour le côté émetteur et NetworkLayer pour le côté récepteur.

public class ControlLayer implements Runnable {
  private SenderGUI window;
  public FileList fileList;

  public ControlLayer () {
    dbg.setLevel (10);
     // tells the fileList who controls it
    fileList = new FileList(10, false, this, 20, 10);
    window = new SenderGUI (this);  // tells the GUI who controls it
    window.preparation();  // defines the GUI
    window.pack();
    window.show();         // shows the GUI that waits for its related events
  }

  // Implements the call-back of the SenderGUI's sendButton
  public void sendAction () {
    fileList.sendItem ();
  }

  public static void main (String argv[]) {
    ControlLayer controlLayer = new ControlLayer ();
  }
}

Comme on le voie ci-dessus, la méthode main() instancie l'objet dans lequel elle est implémentée (ControlLayer ou NetworkLayer, donc), et s'arrête. Et c'est le constructeur qui instancie à son tour un objet de la classe GUI, à savoir SenderGUI pour le côté émetteur et ReceiverGUI pour le côté récepteur, en lui passant une référence sur lui-même (le this de window = new SenderGUI (this);) afin de pouvoir être rappelé par l'interface utilisateur.

Dans ce schéma, la méthode main() de l'objet implémentant la couche contrôle ``rend la main'' tout de suite. C'est l'objet implémentant l'interface graphique qui ``garde la main'' pour scruter les événements déclenchés par l'utilisateur.

Dans le nouveau modèle de Java 1.1 gérant les événements, il faut enregistrer les méthodes à appeler, lors d'un événement particulier, auprès des objets déclenchant ces événements. Par exemple, un bouton déclenche un événement lorsque l'utilisateur appuie dessus, et l'on doit donc enregistrer auprès de ce bouton la méthode à invoquer lorsque l'utilisateur agira dessus.

public class SenderGUI extends Frame {
  private ControlLayer controlLayer;
  
  public SenderGUI (ControlLayer c) {
    super("The Sender Window");
    controlLayer = c;
  }

  public void preparation () {
    Button sendButton;
    sendButton = new Button ("Send");

    // Registers the actionPerformed method to the sendButton
    sendButton.addActionListener ( new ActionListener () {
      public void actionPerformed (ActionEvent e) {
        // Calls the corresponding method within controlLayer
        controlLayer.sendAction ();
      }
    });
  }
}

La méthode de rappel, le call-back (ci-dessus, actionPerformed()), est encapsulée dans un objet scruteur d'événements (ci-dessus, ActionListener) de type correspondant à celui des événements déclenchés (voir l'API Java 1.1 de gestion des événements pour plus de précisions). Dans notre cas, la méthode de rappel, encapsulée dans l'objet d'interface utilisateur (SenderGUI ou ReceiverGUI, donc), appelle à son tour la méthode correspondante implémentée dans l'objet de la couche contrôle ayant lancé l'interface graphique.


  
Figure 9: Gestion des événements du côté émetteur
\begin{figure}
 \centering
\includegraphics [width=10cm]{serverEvent.ps}\end{figure}

Ainsi, l'objet interface utilisateur n'est ni plus ni moins qu'un relais entre l'utilisateur et la couche de contrôle, qui affiche des fenêtres et des dialogues, et qui relaie les événements générés par l'utilisateur. Tout cela est récapitulé sur la figure 9.


next up previous
Next: 4.3 Relation entre ControlLayer Up: 4 Composition - Structure Previous: 4.1 Présentation
Denis Arnaud
12/19/1997