MIM1
TD 6 de POOGL
Interface graphique : les évènements

Vincent BOUDET
Bureau 343 (84-70)
email vboudet@ens-lyon.fr

15 mars 2001

A   Commençons doucement

Nous avons vu la dernière fois comment créer des interfaces graphiques. Pour leur donner vie, on doit s'attacher à gérer les évènements. Pour ce faire, nous allons étudier ce problème avec un simple bouton. En Java la gestion des évènements se fait de la manière suivante : Tout ceci est donc fort simple.

Question A.1   Écrivez une classe Fenetre étendant la classe Frame dans laquelle vous placerez un bouton. Ce bouton doit changer son label quand on clique dessus.


Solution A.1   Normalement, vous avez obtenu un programme proche de celui-ci :

import java.awt.*;
import java.awt.event.*;

public class Fenetre extends Frame implements ActionListener
{
    Button b;
    
    Fenetre()
    {
        super();
        b = new Button("Appuyer ici");
        b.addActionListener(this);
        add(b);
    }
    public static void main(String arg[])
    {
        Fenetre f = new Fenetre();
        f.setSize(250,100);
        f.setVisible(true);
    }

    public void actionPerformed(ActionEvent e)
    {
        if (b.getLabel().equals("Appuyer ici"))
            b.setLabel("Ca fait mal !");
        else 
            b.setLabel("Appuyer ici");
    }
}

B   Et la fenêtre ?

Notre fenêtre ne se ferme pas quand on le lui demande. Qu'à celà ne tienne, ajoutons un ecouteur d'évènements ! Ajoutons un addWindowListener pour être à l'écoute des évènements agissant sur la fenêtre et (re-)définissons la fonction windowOpened(WindowEvent).

Question B.1   Essayer ! Que se passe t'il ?
Solution B.1   Nous avons écrit que nous implémentions l'interface WindowListener. Java s'attend donc à ce que nous redéfinissions toutes les fonctions relatives à cette interface.
Comment résoudre ce problème ? Il faut avoir recours à des WindowAdapter. Un WindowAdapter est un Listener personnalisable où on peut ne redéfinir que les fonctions qui nous sont nécessaires.

Pour résoudre l'exemple précédent, on va créer une classe WindowCloser :
class WindowCloser extends WindowAdapter
{
    public void windowClosing(WindowEvent e)
    {
 System.exit(0);
    }
}
Maintenant, il suffit de passer en argument a addWindowListener une instance de WindowCloser.
Question B.2   Modifier la classe Fenetre pour gérer la fermeture de fenêtre.
Solution B.2   Vous devez avoir quelque chose comme :

...
    Fenetre()
    {
 super();
 b = new Button("Appuyer ici");
 b.addActionListener(this);
 add(b);
 addWindowListener(new WindowCloser());
    }
...

C   Un éditeur de texte

Nous allons maintenant réaliser un éditeur de texte simple pour appliquer ce que nous avons vu.

Question C.1   Créer une classe TextEditor qui étend la classe Frame. Pour l'instant, On ne réalise que la partie graphique de notre programme. Il faut donc mettre une barre de menu avec un menu File qui possède quatre entrées : New, Open, Save, Quit et un TextArea.

Question C.2   Ajouter comme précédement un ``Adapter'' pour gérer la fermeture de fenêtre.

On va définir quatre petites classes implémentant ActionListener. Ces classes, nommées ActionQuit, ActionNew, ActionOpen, ActionSave, possèdent un constructeur prenant un argument de type TextEditor et redéfinissent la méthode actionPerformed. Par exemple, la classe ActionQuit resemblera à :
class ActionQuit implements ActionListener
{
    TextEditor te;
    ActionQuit(TextEditor t)
    {
        te=t;
    }

    public void actionPerformed(ActionEvent e)
    {
        te.quit();
    }
}
Question C.3   Construisez les classes ActionNew, ActionOpen et ActionSave sur le modèle précédent.

Il faut maintenant ajouter à nos différents MenuItem nos écouteurs d'évènements.
Question C.4   Modifiez la classe TextEditor pour ajouter nos écouteurs.

Il nous reste plus qu'à définir nos quatre fonctions.
Question C.5   Implémentez la méthode quit de TextEditor

Question C.6   Implémenter la méthode newFile (on ne peut pas l'appeler new, c'est un mot réservé).

Pour les méthodes open et save, vous allez avoir besoin d'utiliser les classes suivantes : FileDialog (et ses méthodes getFile et getDirectory), FileReader (méthode utile : read()) et FileWriter (méthode utile write()).
Question C.7   Écrivez les méthodes open() et save().

Si tout s'est bien passé, vous obtenez un petit éditeur de texte simple.


This document was translated from LATEX by HEVEA.