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.
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.