POO et Java
Daniel Tschirhart & Pierre Sosinski - TP4 POO et Java Introduction aux interfaces graphiques 1/10
TP JAVA 4 : INTRODUCTION AUX INTERFACES GRAPHIQUES
Buts poursuivis par ce TP
Il s’agit de mettre en place de petites applications qui n’ont d’autre but que de vous faire assimiler les
mécanismes utilisés par les principaux objets de la bibliothèque AWT.
Toutes les applications sont obtenues en dérivant la classe Frame.
Les éléments qui devront être assimilés dans ce TP sont :
La lecture des diagrammes de classe.
Le mécanisme d’héritage de classe (un des concepts de la P.O.O).
Le mécanisme d’héritage d’interface (contrat entre une classe et une interface) : un autre concept de la
P.O.O.
Les principaux concepts de P.O.O mis en œuvre dans la bibliothèque AWT.
Le principe de la programmation événementielle (les différents types d’écouteurs et leur abonnement).
Remarques : Lire le TP très attentivement.
Les parties E1..E5 sont précédées d’un diagramme de classes de conception.
1. Projet TP4, classe E1.
+ void windowActivated (WindowEvent e)
+ void windowClosed (WindowEvent e)
+ void windowClosing (WindowEvent e)
+ void windowDeactivated(WindowEvent e)
+ void windowDeiconified(WindowEvent e)
+ void windowIconified (WindowEvent e)
+ void windowOpened (WindowEvent e)
<< interface >> WindowListener
a besoin
+ void windowActivated (WindowEvent e)
+ void windowClosed (WindowEvent e)
+ void windowClosing (WindowEvent e)
+ void windowDeactivated(WindowEvent e)
+ void windowDeiconified(WindowEvent e)
+ void windowIconified (WindowEvent e)
+ void windowOpened (WindowEvent e)
E1
+ void setTitle(String title)
+ void setVisible(boolean b)
Frame
spécialise
(extends)
réalise
(implements)
+ public void addWindowListener(WindowListener l)
+ public void setSize(int width,int height)
Window
Container
extends
Component
extends
extends
extends
Object
En Java, Object est la classe-mère
de toutes les classes.
E1 s’auto-écoute :
L’exercice E1 illustre
comment une classe E1
peut être son propre
« écouteur de fenêtre ».
Couleur Bleue = Les développeurs de Java/Eclipse ont déjà fait le travail pour nous… donc
nous n’avons qu’à comprendre et importer les « bons paquetages » !
Couleur Rouge = L’énoncé du TP nous demande de REFLECHIR et d’…
ECRIRE « le BON CODE au BON ENDROIT » !
écouteur
écouté
POO et Java
Daniel Tschirhart & Pierre Sosinski - TP4 POO et Java Introduction aux interfaces graphiques 2/10
Concepts à assimiler :
Mettre en place un gestionnaire d’événements ou écouteur déclaré dans une interface.
Objectif du TP :
Afficher une fenêtre et mettre en place l'écouteur permettant de fermer la fenêtre.
Travail demandé :
Ajouter une classe E1 au projet TP4. Cette classe comporte une fonction main().
Dériver E1 de la classe Frame. Vous héritez maintenant de toute la hiérarchie de la classe Frame
Dans le constructeur :
Appeler la fonction setTitle (héritée de la classe Frame) pour donner le titre « Exercice E1 »
à la fenêtre (pour trouver les fonctions accessibles dans l’objet courant, préciser this).
Appeler la fonction setSize (héritée de la classe Frame) pour définir une taille de la fenêtre de
400 pixels de large et 200 pixels de haut.
Dériver la classe E1 de l’interface WindowListener (voir cours comment dériver d'une
interface). En dérivant WindowListener vous passez un contrat avec l’interface qui vous
impose de définir (dans le jargon implémenter) toutes les fonctions déclarées dans cette interface.
Nota : eclipse peut le faire pour vous (cliquer à la marge sur la croix rouge et choisir
Add unimplemented methods).
A l’aide de la méthode addWindowListener héritée de la classe Frame, abonner la fenêtre aux
événements «window events» (voir cours).
Dans le gestionnaire d’événements WindowClosing arrêter l’application avec System.exit(0);
Dans main, instancier la classe E1 et afficher la fenêtre à l’aide de la fonction setVisible
présente dans l’objet (hérité de la classe Frame).
POO et Java
Daniel Tschirhart & Pierre Sosinski - TP4 POO et Java Introduction aux interfaces graphiques 3/10
2. Projet TP4, classe E2
+ void windowActivated (WindowEvent e)
+ void windowClosed (WindowEvent e)
+ void windowClosing (WindowEvent e)
+ void windowDeactivated(WindowEvent e)
+ void windowDeiconified(WindowEvent e)
+ void windowIconified (WindowEvent e)
+ void windowOpened (WindowEvent e)
<< interface >> WindowListener
a besoin
E2
+ void setTitle(String title)
Frame
spécialise
(extends)
réalise
(implements)
+ public void addWindowListener(WindowListener l)
+ public void setSize(int width,int height)
Window
extends
+ void windowActivated (WindowEvent e)
+ void windowClosed (WindowEvent e)
+ void windowClosing (WindowEvent e)
+ void windowDeactivated(WindowEvent e)
+ void windowDeiconified(WindowEvent e)
+ void windowIconified (WindowEvent e)
+ void windowOpened (WindowEvent e)
<< abstract >> WindowAdapter
+ void windowClosing (WindowEvent e)
MyWindowClassAdapter
spécialise
(extends)
écouteur
E2 possède un écouteur externe :
L’exercice E2 illustre comment une classe
autre que E2 (ici MyWindowClassAdapter)
peut aussi être « écouteur de fenêtre »
de la classe E2 en héritant d’un
adaptateur » qui fait le travail
« fastidieux » à notre place.
écouté
Concepts à assimiler :
Redéfinir (traduction de overload) un gestionnaire d’événement ou écouteur défini dans une classe
abstraite.
Description et objectif du TP :
Dans le TP précédent vous avez défini les nombreuses fonctions déclarées dans l’interface
WindowListener. Sans l’aide d’eclipse, ce travail aurait été très fastidieux.
Les concepteurs de la bibliothèque AWT ont prévu un mécanisme alternatif très astucieux consistant à
faire hériter une classe abstraite (dans le cas présent WindowAdapter) de l’interface
WindowListener. Cette classe définit toutes les fonctions de l’interface par des fonctions vides
(comme la plupart des gestionnaires définis dans l’exercice E1).
La classe WindowAdapter est rendue abstraite (par le préfixe abstract) pour interdire toute
instanciation directe de la classe, instanciation ne présentant aucun intérêt (la classe ne comporte que
des fonctions vides). Par contre en héritant de cette classe vous n’aurez besoin que de redéfinir la ou les
fonctions qui vous intéressent.
Voici le code de la bibliothèque Java illustrant ce mécanisme :
interface WindowListener
{
void windowActivated(WindowEvent e);
void windowClosing (WindowEvent e);
// ...
}
abstract class WindowAdapter implements WindowListener
{
public void windowActivated(WindowEvent e)
{
}
public void windowClosing (WindowEvent e)
{
}
// ...
}
POO et Java
Daniel Tschirhart & Pierre Sosinski - TP4 POO et Java Introduction aux interfaces graphiques 4/10
// Il ne reste plus qu’à définir son propre écouteur venant en remplacement de celui situé dans WindowAdapter.
// Attention l’écouteur doit avoir la même signature que la fonction équivalente définie dans WindowAdapter
class MyWindowClassAdapter extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
Travail demandé :
Ajouter une classe publique E2 au projet TP4. Cette classe comporte une fonction main().
Dériver E2 de la classe Frame.
Dans un fichier séparé définir une classe publique MyWindowClassAdapter héritant de la classe
abstraite WindowAdapter.
Dans la classe MyWindowClassAdapter définir la fonction windowClosing. Cette fonction doit
redéfinir la fonction windowClosing définie dans la classe héritée. Attention il faut la même
signature (se reporter à la documentation du JDK et chercher WindowAdapter).
Dans windowClosing appeler System.exit(0).
Dans le constructeur de la classe E2 :
Donner le titre «Exercice E2» à la fenêtre.
Définir une taille de la fenêtre de 400 pixels de large et 200 pixels de haut.
A l’aide de la fonction addWindowListener hérité de la classe Frame, abonner la fenêtre (c'est-
à-dire l’objet courant de la classe E2) aux événements liés à la fenêtre. Cet abonnement est
réalisé en instanciant la classe MyWindowClassAdapter dans le paramètre de la fonction
(voir cours).
Dans main instancier la classe E2 et afficher la fenêtre à l’aide de la fonction setVisible.
POO et Java
Daniel Tschirhart & Pierre Sosinski - TP4 POO et Java Introduction aux interfaces graphiques 5/10
3. Projet TP4, classe E3
- Label addLabel (String text)
- Button addButton(String text)
+ void actionPerformed(ActionEvent e)
+ int compteur
E3
+ void setTitle(String title)
Frame
spécialise
(extends)
+ void windowClosing (WindowEvent e)
MyWindowClassAdapter
écouteur
void setText(String text)
Label
label1
void addActionListener(ActionListener l)
Button
button
void actionPerformed(ActionEvent e)
<< interface >> ActionListener
réalise
(implements)
affiche le compteur dans
a besoin
+ public void addWindowListener(WindowListener l)
+ public void setSize(int width,int height)
Window
+ void setLayout(LayoutManager mgr)
+ Component add(Component comp)
Container
spécialise
(extends)
spécialise
(extends)
E3 écoute son bouton :
L’exercice E3 illustre le cas où la fenêtre E3 écoute son composant de type Button.
E3 ajoute 2 composants label1:Label et button:Button à une fenêtre E3 qui joue le rôle
d’« écouteur d’action » pour button, en réalisant l’interface « ActionListener » puis en s’abonnant
auprès du bouton.
écouté
écouteur
écouté
Objectif principal :
Mettre en place plusieurs contrôles et définir un gestionnaire d’événement par héritage d'interface.
Regrouper dans une fonction (comme le fait WindowBuilder) l’essentiel de la glue associée à un contrôle.
Rappel :
Pour être accessible depuis plusieurs fonctions membres d’une classe, un objet ou une variable doit être
déclarée en tant qu’attribut d’instance (portée private si l’accès est limité aux fonctions membres de la
classe).
Description et objectif du TP :
Dans le TP précédent vous avez défini une classe dans laquelle vous avez mis en place un gestionnaire
d’événement.
Dans l’exercice présent vous allez apprendre :
A mettre en place deux contrôles : un label et un bouton.
A agencer dans une fenêtre des contrôles disposés suivant l’ordre d’ajout (FlowLayout).
1 / 10 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !