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 :
-
on ajoute à l'objet considéré un ``ecouteur d'évènement''
(ActionListener)
Exemple: b.addActionListener(this)
- on définit la fonction de rattrapage des évènements (actionPerformed)
Exemple: public void actionPerformed(ActionEvent e)
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.