Interfaces ggpqraphiques Introduction -...
Transcript of Interfaces ggpqraphiques Introduction -...
![Page 1: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/1.jpg)
Interfaces graphiquesg p q-
IntroductionIntroductionUniversité de Nice - Sophia Antipolis
Version 4 5 2 13/3/11Version 4.5.2 – 13/3/11Richard Grin
Richard Grin Interface graphique 1
![Page 2: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/2.jpg)
Contributions• Des exemples de cette partie du cours sont
f i i d lifortement inspirés du livreAu cœur de Java 2 Volume I - Notions fondamentalesde Horstmann et Cornellde Horstmann et CornellThe Sun Microsystems PressJava SeriesJava Series
• De nombreuses images proviennent du tutorial en ligne d’Oracle (gratuit) : http://download.oracle.com/javase/tutorial
Richard Grin Interface graphique 2
![Page 3: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/3.jpg)
Pl d tt tiPlan de cette partieGé é li é l i f hi• Généralités sur les interfaces graphiques
• Affichage d’une fenêtreg• Classes de base ; AWT et Swing• Placer des composants dans une fenêtre• Gestion des événementsGestion des événements• Modèle MVC ; exemple des listes• Dessiner ; afficher une image
Richard Grin Interface graphique 3
![Page 4: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/4.jpg)
Généralités sur les i f hiinterfaces graphiques
Richard Grin Interface graphique 4
![Page 5: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/5.jpg)
Interface avec l’utilisateur• La quasi-totalité des programmes informatiques
inécessitent – l’affichage de questions posées à l’utilisateurg q p– l’entrée de données par l’utilisateur
l’affichage des résultats obtenus par le traitement– l affichage des résultats obtenus par le traitement informatique
C é h d’i f i ’ ff• Cet échange d’informations peut s’effectuer avec une interface utilisateur (UI en anglais) en mode texte (ou console) ou en mode graphique
Richard Grin Interface graphique 5
![Page 6: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/6.jpg)
Interface graphiqueg p q• Une interface graphique est formée d’une ou
l i f êt i ti t diplusieurs fenêtres qui contiennent divers composants graphiques (widgets) tels que– boutons– listes déroulanteslistes déroulantes– menus
h t t– champ texte– etc.
• Les interfaces graphiques sont souvent appelés GUI d’après l’anglais Graphical User Interface
Richard Grin Interface graphique 6
GUI d après l anglais Graphical User Interface
![Page 7: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/7.jpg)
Un exemple
Richard Grin Interface graphique 7
![Page 8: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/8.jpg)
Programmation avec ginterface graphique
• L’utilisateur peut interagir à tout moment avec plusieurs objets graphiques : bouton, liste déroulante, menu, champ texte, etc., , p ,
• Ces actions peuvent modifier totalement le h i t dcheminement du programme
• L’ordre d’exécution des instructions ne peut être pprévu à l’écriture du code
Richard Grin Interface graphique 8
![Page 9: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/9.jpg)
Programmation conduite par les événements
U i t f hi i f• Une interface graphique impose une façon particulière de programmer
• La programmation « conduite par les événements » est du type suivant :yp– les actions de l’utilisateur (déplacement, clic
de souris, frappe de touche du clavier,…)de souris, frappe de touche du clavier,…) engendrent des événements qui sont mis dans une file d’attentedans une file d attente
– le programme récupère un à un ces événements et les traite
Richard Grin Interface graphique 9
événements et les traite
![Page 10: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/10.jpg)
Boîtes à outils graphiquesBoîtes à outils graphiques
• Les boîtes à outils graphiques offrent des facilités pour utiliser et gérer la file d’attente desfacilités pour utiliser et gérer la file d attente des événementsE i li i l é é• En particulier pour associer les événements avec les traitements qu’ils doivent déclencher
Richard Grin Interface graphique 10
![Page 11: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/11.jpg)
La solution Java : les écouteursLa solution Java : les écouteurs• Le JDK utilise une architecture de type yp
« observateur - observé » :les composants graphiques (boutons listes– les composants graphiques (boutons, listes, menus,…) sont les observés
– chaque composant graphique a ses observateurs (ou écouteurs, listeners) quiobservateurs (ou écouteurs, listeners) qui s’enregistrent auprès de lui comme écouteur d’un certain type d’événement (par exempled un certain type d événement (par exemple, clic de souris)
Richard Grin Interface graphique 11
![Page 12: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/12.jpg)
Rôle d’un écouteurRôle d un écouteur• Il est prévenu par le composant graphique• Il est prévenu par le composant graphique
dès qu’un événement qui le concerne i t tsurvient sur ce composant
• Il exécute alors l’action à effectuer en réaction à l’événement
• Par exemple l’écouteur du bouton « Exit »• Par exemple, l écouteur du bouton « Exit » demande une confirmation à l’utilisateur et
i l li itermine l’application
Richard Grin Interface graphique 12
![Page 13: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/13.jpg)
API utilisées pour les interfaces hi Jgraphiques en Java
Richard Grin Interface graphique 13
![Page 14: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/14.jpg)
Les API• 2 bibliothèques :
– AWT (Abstract Window Toolkit, JDK 1.1)– Swing (JDK 1.2)g ( )
• Swing et AWT font partie de JFC (Java Foundation Classes) qui offre des facilités pourFoundation Classes) qui offre des facilités pour construire des interfaces graphiques
• Swing est construit au-dessus de AWT– même gestion des événementsmême gestion des événements– les classes de Swing héritent des classes de AWT
Richard Grin Interface graphique 14
![Page 15: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/15.jpg)
Swing ou AWT ?Sw g ou W ?• Tous les composants de AWT ont leur p
équivalent dans Swingen plus joli
Mais Swing est pluslourd et plus lent– en plus joli
– avec plus de fonctionnalitéslourd et plus lent
que AWT
• Swing offre de nombreux composants qui n’existent pas dans AWTp
⇒ Il est fortement conseillé d’utiliser les S i d écomposants Swing et ce cours sera donc centré
sur SwingRichard Grin Interface graphique 15
![Page 16: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/16.jpg)
Paquetages principauxPaquetages principaux• AWT : java awt et java awt eventAWT : java.awt et java.awt.event• Swing : javax.swing, javax.swing.event, et
des sous-paquetages de javax.swing dont les principaux sontp p– liés à des composants ; table, tree, text (et ses
sous-paquetages), filechooser, colorchoosersous paquetages), filechooser, colorchooser– liés au look and feel général de l’interface (plaf =
pluggable look and feel) ; plaf plaf basicpluggable look and feel) ; plaf, plaf.basic, plaf.metal, plaf.windows, plaf.motif
Richard Grin Interface graphique 16
![Page 17: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/17.jpg)
Afficher une fenêtre
Richard Grin Interface graphique 17
![Page 18: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/18.jpg)
Affichage du GUI cas simpleAffichage du GUI, cas simple• Une classe (appellons la Fenetre)• Une classe (appellons-la Fenetre)
représente la fenêtre principale de l’ li ti ll hé it d l ll’application ; elle hérite de la classe JFrame
• La construction de l’interface graphique peut g p q pse faire dans le constructeur de la classe FenetreFenetre
• L’affichage est alors effectué en appelant le d l f êconstructeur de la fenêtre :
new Fenetre();
Richard Grin Interface graphique 18
![Page 19: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/19.jpg)
Construire le GUIConstruire le GUIimport javax swing JFrame;
ousetTitle("...")
import javax.swing.JFrame;
public class Fenetre extends JFrame {ppublic Fenetre() {super("Une fenêtre");// k()// ou pack(); setSize(300, 200);setVisible(true); ou setBounds(…)
compacte le contenu de la fenêtre
setVisible(true); }public static void main(String[] args) {
affiche la fenêtre
new Fenetre();}
Richard Grin Interface graphique 19
![Page 20: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/20.jpg)
Taille d’une fenêtreTaille d une fenêtre
d à l f êt l t ill é i• pack() donne à la fenêtre la taille nécessaire pour respecter les tailles préférées des composants de la fenêtre (tout l’écran si cette taille est supérieure à la taille de l’écran)p )
• Taille ou un emplacement précis sur l’écran (en pixels) : setLocation(int xhg, int yhg) (ou Point en paramètre)( g, y g) ( p )setSize(int largeur, int hauteur) (ou Dimensionen paramètre)setBounds(int x int y int largeur intsetBounds(int x, int y, int largeur, inthauteur) (ou Rectangle en paramètre)
Richard Grin Interface graphique 20
![Page 21: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/21.jpg)
Positionnement d’une fenêtre et icône(On doit importer java.awt.*)public Fenetre() {public Fenetre() {
// Centrage de la fenêtreToolkit tk = Toolkit.getDefaultToolkit();gDimension d = tk.getScreenSize();int hauteurEcran = d.height;int largeurEcran = d.width;setSize(largeurEcran/2, hauteurEcran/2);setLocation(largeurEcran/4 hauteurEcran/4);setLocation(largeurEcran/4, hauteurEcran/4);// tant qu’on y est, ajoutons l’icône…Image img = tk.getImage("icone.gif");setIconImage(img);. . . setLocationRelativeTo(null)
centre une fenêtre sur l’écranRichard Grin Interface graphique 21
} centre une fenêtre sur l’écran
![Page 22: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/22.jpg)
Affichage du GUIAffichage du GUI, cas plus complexep p
• Pour accélérer le démarrage de l’application Pour accélérer le démarrage de l application graphique et pour éviter que l’interface graphique ne se fige dans certains cas il estgraphique ne se fige dans certains cas, il est conseillé de lancer l’affichage selon le
hé i di é d l t t i tschéma indiqué dans le transparent suivant• Des explications détaillées sont données p
dans la section « Swing et threads »
Richard Grin Interface graphique 22
![Page 23: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/23.jpg)
Afficher une fenêtre (2ème façon)Afficher une fenêtre (2 façon)private static void construireAfficherGUI() {private static void construireAfficherGUI() {
new Fenetre();}
public static void main(String[] args) {S i Utiliti i k L t ( R bl () {SwingUtilities.invokeLater(new Runnable() { public void run() { construireAfficherGUI();construireAfficherGUI();
} });
}
Richard Grin Interface graphique 23
![Page 24: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/24.jpg)
Garder une fenêtre au premier plan
• Depuis le JDK 5, il est possible d’indiquer qu’une fenêtre doit être au premier plan (par rapport aux autres fenêtres) :pp )frame.setAlwaysOnTop(true);
Richard Grin Interface graphique 24
![Page 25: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/25.jpg)
Classe java.awt.Toolkit• Les sous-classes de la classe abstraiteT lkit i l t t l ti d AWT i tToolkit implantent la partie de AWT qui est en contact avec le système d’exploitation hôte
• Quelques méthodes publiques :getScreenSize, getScreenResolution,getScreenSize, getScreenResolution, getDefaultToolkit, beep, getImage, createImage getSystemEventQueuecreateImage, getSystemEventQueue
• getDefaultToolkit fournit une instance de la classe qui implante Toolkit (classe donnée par la propriété awt.toolkit)
Richard Grin Interface graphique 25
do ée pa a p op été a t.too t)
![Page 26: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/26.jpg)
Émettre un bipÉmettre un bip• La méthode beep() de la classe Toolkit• La méthode beep() de la classe Toolkit
permet d’émettre un bip :tk b ()tk.beep();
• L’instance de Toolkit s’obtient par la pméthode getDefaultToolkit()
• Le plus souvent ce bip prévient l’utilisateur• Le plus souvent ce bip prévient l utilisateur de l’arrivée d’un problème ou d’un événement
Richard Grin Interface graphique 26
![Page 27: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/27.jpg)
É d déÉcran de démarrageD i J 6 l l’ li ti d• Depuis Java 6, lorsque l’application prend un certain temps à s’initialiser, il est possible de faire afficher une image (JPEG, GIF ou PNG) de démarrage pour faire ) g ppatienter l’utilisateur et lui signaler que l’application a vraiment démarrél application a vraiment démarré
• L’image sera effacée dès l’ouverture de la première fenêtre de l’application
Richard Grin Interface graphique 27
![Page 28: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/28.jpg)
E lExemple
• Il suffit de passer l’image en paramètre du java qui lance l’application ; par exemple java qu a ce app ca o ; pa e e p ejava –splash:image.jpg Main
• Si l’application est dans un jar il est• Si l application est dans un jar, il est possible d’indiquer l’image « splash » dans l fi hi A S d j lle fichier MANIFEST du jar ; par exempleManifest-Version: 1.0 Main-Class: Test SplashScreen-Image: image.gif
Richard Grin Interface graphique 28
![Page 29: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/29.jpg)
Écran de démarrage plus complexe
• Pour faire afficher un écran de démarrage plus complexe qu’une simple image fixe, il est possible de récupérer une référence vers p pl’image « splash » pour obtenir un graphique modifiablemodifiable
• Il est possible de faire effacer l’image avant l’apparition de la première fenêtre par la méthode close() de SplashScreen
Richard Grin Interface graphique 29
![Page 30: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/30.jpg)
Exempleimport java.awt.SplashScreen;...SplashScreen splash =
S l hS S l hS ()SplashScreen.getSplashScreen();Graphics2D g =
(Graphics2D)splash.createGraphics();...
splash.close();
Richard Grin Interface graphique 30
![Page 31: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/31.jpg)
Composants lourds et légersClasses Container et
JC tJComponent
Richard Grin Interface graphique 31
![Page 32: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/32.jpg)
Composants lourdsp• Pour afficher des fenêtres (instances de
) J ’ i l f êJFrame), Java s’appuie sur les fenêtres fournies par le système d’exploitation hôte d l l ldans lequel tourne la JVM
• Les composants Java qui, comme les JFrame, p q , ,s’appuient sur des composants du système hôte sont dit « lourds »
• L’utilisation de composants lourds améliore la rapidité d'exécution mais nuit à la portabilité etrapidité d exécution mais nuit à la portabilité et impose les fonctionnalités des composants
Richard Grin Interface graphique 32
![Page 33: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/33.jpg)
Composants légersCo pos s ége s
• AWT utilise les widgets du systèmeAWT utilise les widgets du système d’exploitation pour tous les composants graphiq es (fenêtres bo tons listes men s )graphiques (fenêtres, boutons, listes, menus,…)
• Swing ne les utilise que pour les fenêtres de base « top-level »
• Les autres composants dits légers sont dessinés• Les autres composants, dits légers, sont dessinéspar Swing dans ces containers lourds
• Attention, les composants lourds s’affichent toujours au-dessus des composants légers
Richard Grin Interface graphique 33
![Page 34: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/34.jpg)
Containers lourds• Il y a 3 sortes de containers lourds (un autre, JWindow, est plus rarement utilisé) :– JFrame fenêtre pour les applicationsp pp– JApplet pour les applets– JDialog pour les fenêtres de dialogue
• Pour construire une interface graphique avecPour construire une interface graphique avec Swing, il faut créer un (ou plusieurs) container lourd et placer à l’intérieur les composantslourd et placer à l intérieur les composants légers qui forment l’interface graphique
Richard Grin Interface graphique 34
![Page 35: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/35.jpg)
Hiérarchie d’héritage des gcontainers lourds
Container
Wi d P lJComponentWindow PanelJComponent
FrameApplet
Dialog JWindow
JFrameJApplet
JDialog
Richard Grin Interface graphique 35
![Page 36: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/36.jpg)
Libérer les ressources associées à une JFrame
• En tant que composant lourd, une JFrame utilise des ressources du système sous-jacentdes ressources du système sous-jacent
• Si on ne veut plus utiliser une JFrame (ou JDi l JWi d ) i tiJDialog ou JWindow), mais continuer l’application, il faut lancer la méthode di () d l f êt l tdispose() de la fenêtre ; les ressources seront rendues au système
• Voir aussi la constante DISPOSE_ON_CLOSE de l’interface javax.swing.WindowConstants
Richard Grin Interface graphique 36
![Page 37: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/37.jpg)
Classe JComponentClasse JComponent• La plupart des widgets de Swing sont desLa plupart des widgets de Swing sont des
instances de sous-classes de la classe JComponentJComponent
• Les instances des sous-classes de JComponent sont de composants « légers »JComponent sont de composants « légers »
• JComponent héritent de la classe Container• Tous les composants légers des sous-classes
de JComponent peuvent donc contenir pd’autres composants
Richard Grin Interface graphique 37
![Page 38: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/38.jpg)
Classe abstraite JComponent
Object
Component
Les composantsComposants
Container
Les composantsde Swing sont des containers
ComposantsAWT
JComponent
Richard Grin Interface graphique 38
![Page 39: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/39.jpg)
Les Containers
• Des composants sont destinés spécifiquement• Des composants sont destinés spécifiquementà recevoir d’autres éléments graphiques :– les containers « top-level » lourds JFrame, JApplet, JDialog, JWindowpp g
– les containers « intermédiaires » légers JPanel JScrollPane JSplitPaneJPanel, JScrollPane, JSplitPane, JTabbedPane, Box (ce dernier est léger mais n’hérite pas de JComponent)
Richard Grin Interface graphique 39
![Page 40: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/40.jpg)
JPanel• JPanel est la classe mère des containers
intermédiaires les plus simples• Un JPanel sert à regrouper des composants dansUn JPanel sert à regrouper des composants dans
une zone d'écran• Il n’a pas d’aspect visuel déterminé ; son aspect
visuel est donné par les composants qu’il contientp p q• Il peut aussi servir de composant dans lequel on
peut dessiner ce que l’on veut ou faire afficherpeut dessiner ce que l on veut, ou faire afficher une image (par la méthode paintComponent)
Richard Grin Interface graphique 40
![Page 41: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/41.jpg)
Ajouter des composantsAjouter des composantsdans une fenêtre
Richard Grin Interface graphique 41
![Page 42: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/42.jpg)
Le « ContentPane »• Avant le JDK 5, il n’était pas possible
d’ajouter directement d’autres composants aux containers « top-level »p
• Ces containers sont associés à un autre container le « t t » dans leq el oncontainer, le « content pane » dans lequel on ajoute les composants
• On obtient ce content pane par (topLevel est un container lourd ; JFrame par exemple)un container lourd ; JFrame par exemple)Container contentPane =
topLevel.getContentPane();
Richard Grin Interface graphique 42
![Page 43: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/43.jpg)
Depuis JDK 5
• On peut désormais ajouter directement les composants dans un composant « top-level » :frame.add(label, BorderLayout.NORTH);frame.add(b1, BorderLayout.SOUTH);
• Ce container va en fait déléguer à son contentCe container va en fait déléguer à son content pane (qui existe toujours dans le JDK 5)
Richard Grin Interface graphique 43
![Page 44: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/44.jpg)
Ajouter les composantsAjouter les composants• Le plus souvent on ajoute les composants dans le
constructeur (ou dans des méthodes appelées par le constructeur) du composant « top-level » :
public Fenetre() {. . .Container cp = this.getContentPane();JLabel label = new JLabel("Bonjour");
1 !JButton b1 = new JButton("Cliquez moi !");add(label, BorderLayout.NORTH);dd(b1 B d L t SOUTH)add(b1, BorderLayout.SOUTH);. . .
}Richard Grin Interface graphique 44
}
![Page 45: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/45.jpg)
Gestionnaire de mise en placeGestionnaire de mise en place(layout manager)( y g )
Richard Grin Interface graphique 45
![Page 46: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/46.jpg)
PrésentationPrésentation• L’utilisateur peut changer la taille d’une
fenêtre ; les composants de la fenêtre doivent alors être repositionnésp
• Les fenêtres (plus généralement les t i ) tili t d ti i d icontainers) utilisent des gestionnaires de mise
en place (layout manager) pour repositionner leurs composants
• Il existe plusieurs types de layout managersIl existe plusieurs types de layout managersavec des algorithmes de placement différents
Richard Grin Interface graphique 46
![Page 47: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/47.jpg)
Indications de positionnementIndications de positionnement• Quand on ajoute un composant dans unQuand on ajoute un composant dans un
container on ne donne pas la position exacte du composantdu composant
• On donne plutôt des indications de positionnement au gestionnaire de mise en placep– explicites (BorderLayout.NORTH) – ou implicites (ordre d’ajout dans le
container)Richard Grin Interface graphique 47
)
![Page 48: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/48.jpg)
Algorithme de placementAlgorithme de placement
U l l l• Un layout manager place les composants « au mieux » suivant– l’algorithme de placement qui lui est propre
l i di ti d iti t d– les indications de positionnement des composants
– la taille du container les tailles préférées des composants– les tailles préférées des composants
Richard Grin Interface graphique 48
![Page 49: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/49.jpg)
Cl j t Di iClasse java.awt.Dimension
• Cette classe est utilisée pour donner des dimensions de composants en pixelsdimensions de composants en pixels
• Elle possède 2 variables d’instance publiques de type int– heightg– width
C t t Di i (i t i t)• Constructeur : Dimension(int, int)
Richard Grin Interface graphique 49
![Page 50: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/50.jpg)
Tailles des composantsTailles des composants• Tous les composants graphiques (classeTous les composants graphiques (classe Component) ont plusieurs types de tailles qui sont
tilisées po r le r affichageutilisées pour leur affichage– taille maximum– taille préférée
t ill i i– taille minimum• Accesseurs et modificateurs associés (classe (java.awt.Component) : {get|set}{Maximum|Preferred|Minimum}SizeRichard Grin Interface graphique 50
{get|set}{Maximum|Preferred|Minimum}Size
![Page 51: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/51.jpg)
Taille préféréee p é é ée• La taille préférée est la plus utilisée par les p p p
layout managers ; un composant peut l’indiquer en redéfinissant la méthode « DimensiongetPreferredSize() »
• On peut aussi l’imposer « de l’extérieur » avec la• On peut aussi l imposer « de l extérieur » avec la méthode « void setPreferredSize(Dimension) »setPreferredSize(Dimension) »
• Mais le plus souvent, les gestionnaires de mise l i d d illen place ne tiendront pas compte des tailles
imposées de l’extérieurRichard Grin Interface graphique 51
![Page 52: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/52.jpg)
Taille minimumTaille minimum• Quand un composant n’a plus la place pour• Quand un composant n a plus la place pour
être affiché à sa taille préférée, il est affiché à ill i i d illsa taille minimum sans passer par des tailles
intermédiaires• Si la taille minimum est très petite, ça n’est
pas du plus bel effet ; il est alors conseillé depas du plus bel effet ; il est alors conseillé de fixer une taille minimum, par exemple parc setMinimumSize(c getPreferredSize());c.setMinimumSize(c.getPreferredSize());
Richard Grin Interface graphique 52
![Page 53: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/53.jpg)
Ch l LChanger le Layout manager
• Chaque type de container a un gestionnaire de q yp gplacement par défaut
• On peut changer ce gestionnaire de placement• On peut changer ce gestionnaire de placement d’un Container par la méthode
d l lsetLayout(LayoutManager) de la classe Container
Richard Grin Interface graphique 53
![Page 54: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/54.jpg)
Layout manager par défaut d’une fenêtre
i i d i l d f d• Le gestionnaire de mise en place par défaut des fenêtres JFrame est du type BorderLayout
• On peut changer ce gestionnaire de mise en place en envoyant la méthodeplace en envoyant la méthode setLayout(LayoutManager) de la classe Container au content pane
• Depuis le JDK 5 on peut utiliser directement la p pméthode setLayout de la fenêtre (elle délègue au content pane)Richard Grin Interface graphique 54
au content pane)
![Page 55: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/55.jpg)
Types de Layout managerTypes de Layout manager
• Les types les plus courants de gestionnaire de• Les types les plus courants de gestionnaire de mise en place (dans java.awt) : – BorderLayout : placer aux 4 points
cardinaux – FlowLayout : placer à la suite
l d ill– GridLayout : placer dans une grille– GridBagLayout : placements complexesGridBagLayout : placements complexes
Richard Grin Interface graphique 55
![Page 56: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/56.jpg)
Types de Layout managerTypes de Layout manager
• BoxLayout : placer verticalement ou• BoxLayout : placer verticalement ou horizontalement (dans javax.swing)
• Un nouveau gestionnaire de mise en place a été introduit par Java SE 6 (dans javax.swing) : p ( j g)– GroupLayout : placer des groupes de
t di ti t l l tcomposants en distinguant le placement vertical et horizontal
Richard Grin Interface graphique 56
![Page 57: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/57.jpg)
BorderLayout• Affiche au maximum 5 composants (aux 4 points
di t t )cardinaux et au centre)• Essaie de respecter la hauteur préférée du nord et p p
du sud et la largeur préférée de l’est et de l’ouest ; le centre occupe toute la place restantele centre occupe toute la place restante
• layout manager par défaut de JFrame et JDialog
Richard Grin Interface graphique 57
![Page 58: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/58.jpg)
BorderLayout• Les composants sont centrés dans leur zone• On peut spécifier des espacement horizontaux
et verticaux minimaux entre les composants p• Si on oublie de spécifier le placement lors de
l'ajout d'un composant celui ci est placé aul ajout d un composant, celui-ci est placé au centre (source de bug !)
• Règle pratique : l’est et l’ouest peuvent être étirés en hauteur mais pas en largeur ; le p g ;contraire pour le nord et le sud ; le centre peut être étiré en hauteur et en largeurRichard Grin Interface graphique 58
être étiré en hauteur et en largeur
![Page 59: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/59.jpg)
Placement dans une fenêtre complexep• Pour disposer les composants d’une fenêtre de
hi lstructure graphique complexe on peut :– utiliser des containers intermédiaires, ayant , y
leur propre type de gestionnaire de placement et pouvant éventuellementplacement, et pouvant éventuellement contenir d'autres containers
– utiliser un gestionnaire de placement de type GridBagLayout (plus souple mais parfois g y (p p pplus lourd à mettre en œuvre)mixer ces 2 possibilités
Richard Grin Interface graphique 59
– mixer ces 2 possibilités
![Page 60: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/60.jpg)
Utiliser un JPanelpanelBoutons
au nord
Richard Grin Interface graphique 60
![Page 61: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/61.jpg)
Utiliser un JPanelpublic Fenetre() {
. . .. . .JPanel panelBoutons = new JPanel();JButton b1 = new JButton("Cliquez moi !");
b2 ( i i ! )JButton b2 = new JButton("Et moi aussi !");panelBoutons.add(b1); // FlowLayoutpanelBoutons.add(b2);this.add(panelBoutons, BorderLayout.NORTH);JTextArea textArea = new JTextArea(15, 5);this.add(textArea, BorderLayout.CENTER);JButton quitter = new JButton("Quitter");this.add(quitter, BorderLayout.SOUTH);. . .
}
ExécutionSource de la classe
Richard Grin Interface graphique 61
écu oSou ce de a c asse
![Page 62: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/62.jpg)
FlowLayout• Rangement de haut en bas et de gauche à droite• Les composants sont affichés à leur taille
préféréep• layout manager par défaut de JPanel et JAppletJApplet
• Attention, la taille préférée d’un container géré par un Fl L t t l lé idé t t lFlowLayout est calculée en considérant que tous les composants sont sur une seule ligne
Richard Grin Interface graphique 62
![Page 63: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/63.jpg)
Code avec FlowLayoutJPanel panel = new JPanel();// FlowLayout par défaut dans un JPanel// mais si on ne veut pas centrer :panel.setLayout(
new FlowLayout(FlowLayout.LEFT));// On pourrait aussi ajouter des espaces// entre les composants avec// new FlowLayout(FlowLayout.LEFT, 5, 8)y yJButton bouton = new JButton("Quitter");JTextField zoneSaisie = new JTextField(20);( )panel.add(bouton);panel.add(zoneSaisie);
Richard Grin Interface graphique 63
p ( );
![Page 64: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/64.jpg)
GridLayouty• Les composants sont disposés en lignes et en
lcolonnes• Les composants ont tous la même dimensionp• Ils occupent toute la place qui leur est allouée
li l ill li li l• On remplit la grille ligne par ligne ou colonne par colonne (suivant le nombre indiqué au constructeur)
Richard Grin Interface graphique 64
![Page 65: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/65.jpg)
Code avec GridLayoutCode avec GridLayout// 5 lignes n colonnes// 5 lignes, n colonnes// (on pourrait ajouter des espaces entre composants)panel setLayout(new GridLayout(5 0));panel.setLayout(new GridLayout(5,0));panel.add(bouton); // ligne 1, colonne 1panel add(zoneSaisie); // ligne 2 colonne 1panel.add(zoneSaisie); // ligne 2, colonne 1
• On doit indiquer le nombre de lignes ou le nombre de l t tt 0 l’ t b ( i d lcolonnes et mettre 0 pour l’autre nombre (si on donne les
2 nombres, le nombre de colonnes est ignoré !)
L’ t b t l lé d’ è l b• L’autre nombre est calculé d’après le nombre d’éléments ajoutés
Richard Grin Interface graphique 65
![Page 66: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/66.jpg)
GridBagLayoutGridBagLayout
• Utilise un quadrillage dont les composants peuvent q g p poccuper plusieurs « cases » ; la disposition de chaque composant est précisée par une instance dechaque composant est précisée par une instance de la classe GridBagConstraints
l l l l l i i• C’est le layout manager le plus souple mais aussi le plus complexe
Richard Grin Interface graphique 66
![Page 67: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/67.jpg)
Contraintes de baseContraintes de basepanel.setLayout(new GridBagLayout());p y g yGridBagConstraints contraintes =
new GridBagConstraints();g ()// ligne et colonne du haut gauche
contraintes.gridx = 0;contraintes.gridy = 0;// taille en lignes et colonnes (occupe 2 lignes ici)
contraintes.gridheight = 2;contraintes.gridwidth = 1;// Chaque élément peut avoir ses propres contraintes
panel.add(bouton, contraintes);
Richard Grin Interface graphique 67
![Page 68: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/68.jpg)
Autres contraintes : placementAutres contraintes : placement• fill détermine si un composant occupe toute
la place dans son espace réservé (constantes de la classe GridBagConstraint : BOTH, NONE, HORIZONTAL, VERTICAL) ; par défaut NONE
• anchor dit où placer le composant quand il est a c o d où p ace e co posa qua d esplus petit que son espace réservé ; on peut donner des valeurs absolues (CENTER, SOUTH,donner des valeurs absolues (CENTER, SOUTH, NORTHEAST,…) ou relatives à l’orientation du composant (PAGE START, PAGE END,composant (PAGE_START, PAGE_END, LINE_START,…) ; par défaut CENTER
Richard Grin Interface graphique 68
![Page 69: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/69.jpg)
Répartition de l’espace librep p• weightx, weighty (de type double) indique
comment sera distribué l’espace libre Plus le nombrecomment sera distribué l’espace libre. Plus le nombre est grand, plus le composant récupérera d’espace ; par défaut 0défaut 0Si tous les poids sont 0, l’espace est réparti dans les espaces placés entre les composantsplacés entre les composants
• Algorithme : poids d’une colonne = weightxmaximum des composants de la colonne ; total =maximum des composants de la colonne ; total = somme des poids de toutes les colonnes ; l’espace libre d’une colonne est donné par weightx/totald une colonne est donné par weightx/total
• Souvent associé à fill pour les composants qui d i t di l t ill d t
Richard Grin Interface graphique 69doivent grandir avec la taille du composant
![Page 70: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/70.jpg)
La place minimale occupéeLa place minimale occupée• insets ajoute des espaces autour des• insets ajoute des espaces autour des
composants : contraintes.insets = new
(Insets(5,0,0,0) (ou contraintes.insets.top = 5) ; par défaut 0 partout
• ipadx, iapdy ajoutent des pixels à la taille minimum des composants ; par défaut 0minimum des composants ; par défaut 0
• Le layout manager tient compte des tailles préférées et minimales pour afficher les composants
Richard Grin Interface graphique 70
p
![Page 71: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/71.jpg)
Remarque sur le positionnementRemarque sur le positionnementLa ale r par défa t po r id et id• La valeur par défaut pour gridx et gridyest GridBagConstraints.RELATIVE (se place en dessous ou à droite du précédent)
• Il suffit donc de fixer gridx à la valeurIl suffit donc de fixer gridx à la valeur d’une colonne pour les composant de la colonne et de garder la valeur par défaut decolonne et de garder la valeur par défaut de gridy pour placer tous les composants de la colonne les uns à la suite des autres (idem pour les lignes en fixant gridy)
Richard Grin Interface graphique 71
![Page 72: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/72.jpg)
ExempleExempleGridBagConstraints contraintes = g
new GridBagConstraints();contraintes.gridx = 0;contraintes gridy = 0;contraintes.gridy = 0;contraintes.gridwidth = 1;contraintes.gridheight = 1; this add(new JLabel("Sujet : ") contraintes);this.add(new JLabel("Sujet : "), contraintes);contraintes.gridx = 2;// Zone de saisie occupe tout son espace réservé en // largeur et elle occupe le plus d'espace possiblecontraintes.fill = GridBagConstraints.HORIZONTAL;contraintes.weightx = 1;g ;saisieSujetMail = new JTextField(20);this.add(saisieSujetMail, contraintes);
Richard Grin Interface graphique 72
![Page 73: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/73.jpg)
Quand faut il choisir GridBagLayout ?Quand faut-il choisir GridBagLayout ?
• Dès que l’interface devient trop compliquée il est souvent plus simplecompliquée, il est souvent plus simple d’utiliser GridBagLayout plutôt que de trouver des constructions très rusées avectrouver des constructions très rusées avec des containers intermédiaires
• On peut rendre le code plus lisible avec des méthodes qui facilitent l’affectation desméthodes qui facilitent l affectation des contraintes
Richard Grin Interface graphique 73
![Page 74: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/74.jpg)
BoxLayout• Aligne les composants sur une colonne ou une ligne
( h i it à l é ti )(on choisit à la création)• Respecte la largeur (resp. hauteur) préférée et
maximum, et l’alignement horizontal (resp. vertical) • Layout manager par défaut de Box et de JToolBar
Richard Grin Interface graphique 74
![Page 75: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/75.jpg)
BoxLayout• Pour un alignement vertical, les composants sont
affichés centrés et si possibleaffichés centrés et si possible– à leur largeur préférée– respecte leur hauteur maximum et minimum
(get{Maxi|Mini}mumSize())• Pour un alignement horizontal, idem en
intervertissant largeur et hauteur• Pour changer les alignements, on peut utiliser les
méthodes de la classe Componentméthodes de la classe ComponentsetAlignment{X|Y}
Richard Grin Interface graphique 75
![Page 76: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/76.jpg)
Alignment{X|Y}Alignment{X|Y}
C t t d C t• Constantes de Component :• {LEFT|CENTER|RIGHT}_ALIGNMENT
• {TOP|BOTTOM}_ALIGNMENT
• Méthodes :• setAlignmentX et setAlignmentY
Richard Grin Interface graphique 76
![Page 77: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/77.jpg)
Problèmes d’alignementProblèmes d alignement• Si tous les composants gérés par un• Si tous les composants gérés par un BoxLayout n’ont pas le même alignement, on peut avoir des résultats imprévisibles
• Par exemple, le seul composant aligné àPar exemple, le seul composant aligné à gauche peut être le seul qui n’est pas aligné à gauche !à gauche !
• Il vaut donc mieux avoir le même alignement pour tous les composants
Richard Grin Interface graphique 77
![Page 78: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/78.jpg)
Classe BoxClasse Box• Cette classe est un container qui utilise un• Cette classe est un container qui utilise un BoxLayout pour ranger ses composants horizontalement ou verticalement
• Elle fournit des méthodes static pour obtenirElle fournit des méthodes static pour obtenir des composants invisibles pour affiner la disposition de composants dans un containerdisposition de composants dans un container quelconque : glue, étais et zones rigides
Richard Grin Interface graphique 78
![Page 79: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/79.jpg)
Classe Box ; composants invisibles; pcontainer.add(composant1); // On ajoute ici un composant invisible// j pcontainer.add(. . .); container.add(composant2);
Box.createRigidArea(new Dimension(5,0))))
Box.createHorizontalGlue())
new Box.Filler(new Dimension(5,100), new Dimension(5,100),new Dimension(Short.MAX VALUE,100))
Richard Grin Interface graphique 79
_
![Page 80: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/80.jpg)
Code avec BoxCode avec Box// Le plus simple est d'utiliser une Box// mais on peut aussi mettre un BoxLayout// pour gérer un autre containerBox b = Box.createVerticalBox();b.add(bouton);// O t j t d i i ibl// On peut ajouter des zones invisibles// entre les composants :b add(Box createVerticalStrut(5));b.add(Box.createVerticalStrut(5));// ou b.add(Box.createRigidArea(// new Dimension(5 15))// new Dimension(5, 15))b.add(zoneSaisie);
Richard Grin Interface graphique 80
![Page 81: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/81.jpg)
CardLayouty
• CardLayout : affiche un seul composant à laCardLayout : affiche un seul composant à la fois ; les composants sont affichés à tour de rôleC l t l t tili é• Ce layout manager est plus rarement utilisé que les autres
• JTabbedPane est un composant qui offre le même type de disposition en plus simple maismême type de disposition, en plus simple mais plus puissant, avec des onglets
Richard Grin Interface graphique 81
![Page 82: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/82.jpg)
GroupLayoutGroupLayout
I t d it d l JDK 6• Introduit dans le JDK 6• L’idée originale est de dissocier le g
placement horizontal des composants de leur placement verticalleur placement vertical
• Le problème est supposé moins complexe si l 2 di i di iéles 2 dimensions sont dissociées
• Pour les outils de création de GUI (Matisse)( )• Pas toujours facile à lire ni à modifier
Richard Grin Interface graphique 82
![Page 83: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/83.jpg)
Groupes• Les composants sont regroupés dans des
groupes de placement (layout groups)groupes de placement (layout groups)• Chaque groupe de placement peut placer ses
composants suivant 2 arrangements suivant les 2 dimensions horizontale et verticale : séquentiel ou parallèle
• Les groupes peuvent être emboîtés les uns• Les groupes peuvent être emboîtés les uns dans les autres
Richard Grin Interface graphique 83
![Page 84: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/84.jpg)
2 types d’arrangement
• Séquentiel : les composants sont placés les uns à la suite des autres
• Parallèle : les composants sont placés auParallèle : les composants sont placés au même endroit (ce qui suppose un arrangement séquentiel dans l’autrearrangement séquentiel dans l’autre dimension)
Richard Grin Interface graphique 84
![Page 85: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/85.jpg)
ExempleExtrait du tutoriel ExempleHorizontalJava d’Oracle
G1 G2 G3
Le résultat recherché : VerticalG2G1
• Placement horizontal :
G2
Placement horizontal :groupe séquentiel (C1, C2,
groupe parallèle (C3, C4))groupe parallèle (C3, C4))• Placement vertical :
groupe séquentiel (groupe parallèle (C1 C2 C3)groupe séquentiel (groupe parallèle (C1, C2, C3),C4)
Richard Grin Interface graphique 85
![Page 86: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/86.jpg)
Code de l’exemple (1)Code de l exemple (1)GroupLayout layout = p y ynew GroupLayout(getContentPane());
this.setLayout(layout);layout.setHorizontalGroup(layout.createSequentialGroup()
addComponent(c1).addComponent(c1).addComponent(c2).addGroup(layout.createParallelGroup(
GroupLayout.Alignment.LEADING)addComponent(c3).addComponent(c3).addComponent(c4)
);Alignement
à gaucheRichard Grin Interface graphique 86
à gauche
![Page 87: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/87.jpg)
Code de l’exemple (2)layout.setVerticalGroup(layout createSequentialGroup()layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(y p(
GroupLayout.Alignment.BASELINE).addComponent(c1).addComponent(c2).addComponent(C3))
Alignement sur la « ligne d’é it.addComponent(c4)
);
d’écriture »
Richard Grin Interface graphique 87
![Page 88: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/88.jpg)
Taille des composantsp• Un composant ou un groupe peut s’agrandir ou p g p p g
non quand l’espace qui lui est alloué est agrandiV i i t i ’ dit t i• Voici un composant qui ne s’agrandit pas et qui contient 2 composants de la même taille :layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)addComponent(c3 GroupLayout DEFAULT SIZE.addComponent(c3, GroupLayout.DEFAULT_SIZE,
GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(c4, GroupLayout.DEFAULT SIZE,p p y _ ,
GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
Richard Grin Interface graphique 88
![Page 89: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/89.jpg)
Les règles pour la taille
• addComponent prend en paramètre les tailles minimale, préférée, et maximale
• La taille du groupe est celle de la tailleLa taille du groupe est celle de la taille préférée du plus grand composant
l i l ill d• Les composants sont élargis à la taille du groupe si leur taille maximum le permet
Richard Grin Interface graphique 89
![Page 90: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/90.jpg)
Compléments (1)
• Il est possible de changer les espacements entre composants en ajoutant des espaces (gaps) ; méthodes addPreferredGap et (g p ) ; paddContainerGap)
• Il est possible d’automatiser l’ajout• Il est possible d’automatiser l’ajout d’espaces en appelant setAutoCreateGaps(true) et setAutoCreateContainerGaps(true)
Richard Grin Interface graphique 90
![Page 91: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/91.jpg)
Compléments (2)Compléments (2)D t i il t êt é i• Dans certains cas, il peut être nécessaire d’assurer la même taille pour 2 composants qui n’appartiennent pas à un même groupe
• Pour cela il faut utiliser la méthode linkSizePour cela il faut utiliser la méthode linkSize• Par exemple, pour assurer la même taille
h i l à 1 4 25horizontale à c1, c4 et c25 :layout.linkSize(SwingConstants.Horizontal,c1, c4, c25);
Richard Grin Interface graphique 91
![Page 92: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/92.jpg)
Exemples et contre-exemplesBon
Mauvais
E i d 2 l iExercice : donner 2 solutions• avec des composants emboîtés• avec un GridBagLayout
Richard Grin Interface graphique 92
avec un GridBagLayout
![Page 93: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/93.jpg)
Traiter les événements :l é tles écouteurs
Richard Grin Interface graphique 93
![Page 94: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/94.jpg)
E iti d blèExposition du problème
• L’utilisateur utilise le clavier et la souris pour intervenir sur le déroulement du programmeintervenir sur le déroulement du programme
• Le système d’exploitation engendre des é é à i d i d l’ iliévénements à partir des actions de l’utilisateur
• Le programme doit lier des traitements à ces p gévénements
Richard Grin Interface graphique 94
![Page 95: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/95.jpg)
Types d’événementsTypes d événements• Événements de bas niveau, générés directementÉvénements de bas niveau, générés directement
par des actions élémentaires de l’utilisateurÉ é t l i d l h t i• Événements « logiques » de plus haut niveau, engendrés par plusieurs actions élémentaires, qui correspondent à une action complète de l’utilisateur
Richard Grin Interface graphique 95
![Page 96: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/96.jpg)
Exemples d’événements• De bas niveau :
app i s r n bo ton de so ris o ne to che d cla ier– appui sur un bouton de souris ou une touche du clavier– relâchement du bouton de souris ou de la touche– déplacer le pointeur de souris
• Logiques :Logiques :– frappe d’un A majuscule
li d i– clic de souris– lancer une action (clic sur un bouton par exemple)– choisir un élément dans une liste– modifier le texte d'une zone de saisieRichard Grin Interface graphique 96
modifier le texte d une zone de saisie
![Page 97: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/97.jpg)
Événements engendrésvé e e s e ge d és• La frappe d’un A majuscule engendre 5La frappe d un A majuscule engendre 5
événements :4 é é t d b i• 4 événements de bas niveau :– appui sur la touche Majuscule– appui sur la touche A– relâchement de la touche Arelâchement de la touche A– relâchement de la touche Majuscule
• 1 événement logique, de haut niveau :– frappe du caractère « A » majuscule
Richard Grin Interface graphique 97
pp j
![Page 98: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/98.jpg)
Classes d’événementsC sses d évé e e s• Les événements sont représentés par des instances
d l dde sous-classes de java.util.EventObject• Événements liés directement aux actions deÉvénements liés directement aux actions de
l’utilisateur :KeyEvent MouseEvent
fenêtre ouverte,fermée icônifiéeKeyEvent, MouseEvent
• Événements de haut niveau :
fermée, icônifiéeou désicônifiée
FocusEvent, WindowEvent, ActionEvent, ItemEvent, ComponentEvent déclencher, p
composant
déclencherune actionchoix dans une liste,
dans une boîte à cocheracquérir ou
perdre le focusRichard Grin Interface graphique 98
déplacé, retaillé,caché ou montré
dans une boîte à cocherperdre le focus
![Page 99: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/99.jpg)
ÉcouteursÉcouteurs
• Chacun des composants graphiques a ses• Chacun des composants graphiques a ses observateurs (ou écouteurs, listeners)
• Un écouteur doit s’enregistrer auprès des composants qu’il souhaite écouter, en luicomposants qu il souhaite écouter, en lui indiquant le type d’événement qui l’intéresse (par exemple clic de souris)(par exemple, clic de souris)
• Il peut ensuite se désenregistrer
Richard Grin Interface graphique 99
![Page 100: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/100.jpg)
R l ti é t é téRelation écouteurs - écoutés
• Un composant peut avoir plusieurs écouteurs (par exemple 2 écouteurs pourécouteurs (par exemple, 2 écouteurs pour les clics de souris et un autre pour les f d t h d l i )frappes de touches du clavier)
• Un écouteur peut écouter plusieurs p pcomposants
Richard Grin Interface graphique 100
![Page 101: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/101.jpg)
Une questionUne question• Quel message sera envoyé par le composant
à ses écouteurs pour les prévenir que l’événement qui les intéresse est arrivé ?
• Réponse : à chaque type d’écouteur correspond une interface que doitcorrespond une interface que doit implémenter la classe de l’écouteur ; par exemple ActionListener,exemple ActionListener, MouseListener ou KeyListener
• Le message doit correspondre à une des• Le message doit correspondre à une des méthodes de cette interface
Richard Grin Interface graphique 101
![Page 102: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/102.jpg)
Événements étudiés dans ce coursÉvénements étudiés dans ce cours
• En exemple ce cours étudie principalement• En exemple, ce cours étudie principalement– les événements ActionEvent qui conduisent
à des traitements simples (écouteur ActionListener) )
– les événements KeyEvent, au traitement plus complexe (écouteur KeyListener etcomplexe (écouteur KeyListener et adaptateur KeyAdapter)
Richard Grin Interface graphique 102
![Page 103: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/103.jpg)
ActionEvent
• Cette classe décrit des événements de haut niveau qui vont le plus souvent déclencher un traitement (une action) :traitement (une action) :– clic sur un bouton– return dans une zone de saisie de texte– choix dans un menu– choix dans un menu
• Ces événements sont très fréquemment utilisés et ils sont très simples à traiter
Richard Grin Interface graphique 103
![Page 104: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/104.jpg)
Interface ActionListenerInterface ActionListener
• Un objet ecouteur intéressé par les événements de• Un objet ecouteur intéressé par les événements de type « action » (classe ActionEvent) doit appartenir à une classe qui implémente l’interface java.awt.event.ActionListener interface vide
i d• Définition de ActionListener :public interface ActionListener
qui sert demarqueur pour
tous lespextends EventListener {
void actionPerformed(ActionEvent e);}
tous les écouteurs
}
message qui sera envoyé à l’é t ( éth d llb k)
contient des informations l’é é
Richard Grin Interface graphique 104
à l’écouteur (méthode callback) sur l’événement
![Page 105: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/105.jpg)
Inscription commepActionListener
• On inscrit un tel écouteur auprès d’un composant nommé composant par la méthodecomposant.addActionListener(ecouteur);p ( )
• On précise ainsi que ecouteur est intéressé par les événements A ti E t engendrés parles événements ActionEvent engendrés par composant
Richard Grin Interface graphique 105
![Page 106: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/106.jpg)
Message déclenchéMessage déclenché par un événement
• Un événement unActionEvent engendré par une g paction de l’utilisateur sur bouton, provoquera l’envoi d’un message actionPerformed àl envoi d un message actionPerformed à chaque écouteur de bouton :ecouteur actionPerformed(unActionEvent);ecouteur.actionPerformed(unActionEvent);
• Ces messages sont envoyés automatiquement à tous les é i i é è d bécouteurs qui se sont enregistrés auprès du bouton
Richard Grin Interface graphique 106
![Page 107: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/107.jpg)
Interface ActionInterface Action
C tt i t f hé it d• Cette interface hérite de ActionListener• Elle permet de partager des informations et p p g
des comportements communs à plusieurs composantscomposants
• Par exemple, un bouton, un choix de menu et une icône d’une barre de menu peuvent faire quitter une applicationq pp
• Elle est étudiée à la fin de cette partie du cours
Richard Grin Interface graphique 107
![Page 108: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/108.jpg)
Conventions de nommageCo ve o s de o ge• Si un composant graphique peut engendrer desSi un composant graphique peut engendrer des
événements de type TrucEvent sa classe (ou une de ses classes ancêtres) déclare lesune de ses classes ancêtres) déclare les méthodes {add|remove}TrucListener()
• L’interface écouteur s'appellera TrucListener
Richard Grin Interface graphique 108
![Page 109: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/109.jpg)
Écouteur MouseListenerÉcouteur MouseListener• Des interfaces d’écouteurs peuvent avoir de p
nombreuses méthodes• Par exemple les méthodes déclarées par• Par exemple, les méthodes déclarées par
l’interface MouseListener sont : id Cli k d(M E t )void mouseClicked(MouseEvent e)
void mouseEntered(MouseEvent e)id E it d(M E t )void mouseExited(MouseEvent e)
void mousePressed(MouseEvent e) id R l d(M E t )void mouseReleased(MouseEvent e)
Richard Grin Interface graphique 109
![Page 110: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/110.jpg)
Adaptateursd p eu s• Pour éviter au programmeur d’avoir à p g
implanter toutes les méthodes d’une interface « écouteur » AWT fournit des classes (on les« écouteur », AWT fournit des classes (on les appelle des adaptateurs) qui implantent toutes ces méthodesces méthodes
• Le code des méthodes ne fait rien• Ça permet au programmeur de ne redéfinir
dans une sous classe que les méthodes quidans une sous-classe que les méthodes qui l’intéressent
Richard Grin Interface graphique 110
![Page 111: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/111.jpg)
Exemples d’adaptateursExemples d adaptateurs• Les classes suivantes du paquetage• Les classes suivantes du paquetage java.awt.event sont des adaptateurs : KeyAdapter, MouseAdapter, MouseMotionAdapter, FocusAdapter, ComponentAdapter, WindowAdapter
Richard Grin Interface graphique 111
![Page 112: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/112.jpg)
Fermer une fenêtreFermer une fenêtre• Pour terminer l’application à la fermeture de la fenêtre,
on ajoute dans le constructeur de la fenêtre un écouteur :public Fenetre() { // constructeur
. . .addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {public void windowClosing(WindowEvent e) {System.exit(0);
} Classe anonyme interne});. . . ne pas confondre avec
indo Closed()
ypour décrire l’écouteur
} windowClosed()appelée quand les ressourcessystème de la fenêtre sontlibé é ( é h d )
Richard Grin Interface graphique 112
libérées (méthode dispose())
![Page 113: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/113.jpg)
Fermer une fenêtreFermer une fenêtre• Depuis JDK 1.3, on peut se passer d’écouteur pour
arrêter l’application à la fermeture d'une fenêtre :
public Fenetre() { // constructeursetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);. . .
}
• Autres actions possibles à la fermeture d’une fenêtre (ce• Autres actions possibles à la fermeture d une fenêtre (ce sont des constantes de l'interface WindowConstants, implémenté par la classe JFrame) :implémenté par la classe JFrame) :DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, DISPOSE_ON_CLOSE
Richard Grin Interface graphique 113
![Page 114: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/114.jpg)
Paquetage java.awt.event
• Ce paquetage comprend les interfaces « écouteurs » et les classes d’événements
Richard Grin Interface graphique 114
![Page 115: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/115.jpg)
Écriture d’un écouteur
Richard Grin Interface graphique 115
![Page 116: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/116.jpg)
Classe EventObjectj
• Classe ancêtre des classes d’événements• Une instance d’une classe d’événements est
passée en paramètre aux méthodes despassée en paramètre aux méthodes des écouteurs
• Cette instance décrit l’événement qui a provoqué l’appel de la méthodeprovoqué l appel de la méthode
Richard Grin Interface graphique 116
![Page 117: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/117.jpg)
Méthode getSourceg
• L’écouteur peut interroger l’événement pour p g plui demander le composant qui l’a généréL éth d bli Obj t• La méthode « public ObjectgetSource() » de EventObject renvoie le composant d’où est parti l’événement, par exemple un bouton ou un champ de saisie de p ptexte
• Souvent indispensable si l’écouteur écoute• Souvent indispensable si l écouteur écoute plusieurs composants
Richard Grin Interface graphique 117
![Page 118: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/118.jpg)
Exemple de code d’un écouteurExemple de code d un écouteur• Le code suivant modifie le texte du bouton sur
lequel l’utilisateur a cliqué :class EcouteurBouton extends MouseAdapter {p {
public void mousePressed(MouseEvent e) {((JButton)e.getSource()).
tT t("A é")setText("Appuyé");}public void mouseClicked(MouseEvent e) {public void mouseClicked(MouseEvent e) {((JButton)e.getSource()).
setText(e.getClickCount() + "clics");}
}
Richard Grin Interface graphique 118
![Page 119: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/119.jpg)
Tester les touches modificatriceses e es ouc es od c ces
• La classe InputEvent fournit la méthode• La classe InputEvent fournit la méthode getModifiers() qui renvoie un entier indiquant les touches modificatrices (Shift, Ctrl, Alt, Alt Gr) qui étaient appuyées au ) q pp ymoment de l’événement souris ou clavier
• Depuis la version 1 4 il est conseillé d’utiliser• Depuis la version 1.4, il est conseillé d utiliser plutôt la méthode getModifiersEx() qui
i d i déf d l é h dcorrige des petits défauts de la méthode précédente
Richard Grin Interface graphique 119
![Page 120: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/120.jpg)
Tester les touches modificatrices (2)es e es ouc es od c ces ( )• On utilise les constantes static de type int
i d l lsuivantes de la classe InputEvent :SHIFT_MASK , CTRL_MASK, ALT_MASK, META_MASK, ALT_GRAPH_MASK
• Autres constantes de la classe InputEventppour tester les boutons de la souris :BUTTON1 MASK, BUTTON2 MASK, _ , _ ,BUTTON3_MASK
• Si on utilise getModifiersEx, il faut utiliserSi on utilise getModifiersEx, il faut utiliser les constantes qui comportent DOWN dans leur nom ; par exemple SHIFT DOWN MASK
Richard Grin Interface graphique 120
nom ; par exemple, SHIFT_DOWN_MASK
![Page 121: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/121.jpg)
Exemples d’utilisatione p es d u s o
• Tester si la touche Ctrl était appuyée :• Tester si la touche Ctrl était appuyée :(e.getModifiers() & InputEvent.CTRL_MASK) != 0))oue.isControlDown()
• Tester si une des touches Ctrl ou Shift était appuyée :appuyée :e.getModifiers() & (SHIFT_MASK | CTRL_MASK) != 0)
Richard Grin Interface graphique 121
![Page 122: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/122.jpg)
Exemples d’utilisation (2)Exemples d utilisation (2)• Tester si les 2 touches Ctrl ou Shift étaient• Tester si les 2 touches Ctrl ou Shift étaient
appuyées, mais pas la touche Meta (il faudrait b d d i t !)beaucoup de doigts !) :int on = InputEvent.SHIFT_MASK
| InputEvent CTRL MASK;| InputEvent.CTRL_MASK; int off = InputEvent.META_MASK; boolean result =
(e.getModifiers() & (on | off)) == on;
Richard Grin Interface graphique 122
![Page 123: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/123.jpg)
Choisir la classe d’un écouteurChoisir la classe d un écouteur• Comment choisir la classe de l’écouteur d’unComment choisir la classe de l écouteur d un
composant graphique ?O ll d i hi i• On appellera C un des containers graphiques qui contient le composant ; C peut être le container graphique top-level (JFrame le plus souvent) ou n’importe quel container intermédiairen importe quel container intermédiaire
Richard Grin Interface graphique 123
![Page 124: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/124.jpg)
Plusieurs solutions• Plusieurs solutions pour choisir la classe de
l’écouteur :– classe Cclasse C– autre classe spécifiquement créée pour écouter
lle composant :• classe externe à la classe C (rare)( )• classe interne de la classe C• classe interne anonyme de la classe C
(fréquent)Richard Grin Interface graphique 124
( q )
![Page 125: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/125.jpg)
Solution 1 : classe CSolution 1 : classe C
S l ti i l• Solution simple• Mais des inconvénients si le container
contient de nombreux composants :
la classe est encombrée– la classe est encombrée– les méthodes « callback » comportent alors
de nombreux embranchements pour distinguer les cas des nombreux d st gue es cas des o b eucomposants écoutés
Richard Grin Interface graphique 125
![Page 126: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/126.jpg)
Exemple solution 1import java.awt.*; import java.awt.event.*;
public class Fenetre extends JFramepublic class Fenetre extends JFrame implements ActionListener {
private JButton b1 = new JButton("…"), b2 = new JButton("…");
private JTextField tf = new JTextField(10);
public Fenetre() {. . . // ajout des composants dans la fenêtre// t é t l t// Fenetre écoute les composantsb1.addActionListener(this);b2.addActionListener(this);( )tf.addActionListener(this);. . .
}Richard Grin Interface graphique 126
}
![Page 127: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/127.jpg)
Exemple (suite)e p e (su e)public void actionPerformed(ActionEvent e) {
Object source = e getSource(); Suppose queObject source = e.getSource();if (source == b1) {
... // action liée au bouton b1
Suppose quel’on est dans
la portée de b1}else if (source == b2) {
//
qui contient uneréférence au
bouton. . . // action liée au bouton b2}else if (source == tf) {
bouton
else if (source == tf) {. . . // action liée au JTextField tf
}. . .
}
Risque de nombreuxif … else
Richard Grin Interface graphique 127
![Page 128: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/128.jpg)
Variante de la solution 1Variante de la solution 1• Quand les composants à écouter sont trèsQuand les composants à écouter sont très
nombreux, on peut regrouper dans le code les traitements par types de composantsles traitements par types de composants
Richard Grin Interface graphique 128
![Page 129: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/129.jpg)
Exemple variante solution 1ppublic void actionPerformed(ActionEvent e) {
Object source = e.getSource();String classeSource = source.getClass().getName();if (classeSource.equals("JButton")) {( q ( )) {
if (source == b1) {. . . // action liée au bouton b1
}
Regroupement optionnel
}else if (source == b2) {
. . . // action liée au bouton b2}
}else if (classeSource equals("JTextField") {else if (classeSource.equals("JTextField") {
. . . // action liée au JTextField tf}
Richard Grin Interface graphique 129
![Page 130: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/130.jpg)
ActionCommand
• On peut associer à chaque bouton (et choix de menus) une chaîne de caractères parbouton.setActionCommand("chaine");
• Cette chaînepar défaut est le texte affiché sur le bouton– par défaut, est le texte affiché sur le bouton
– permet d’identifier un bouton ou un choix de menu, i dé d t d t t ffi héindépendamment du texte affiché
– peut être modifiée suivant l’état du bouton– peut être récupérée par la méthode getActionCommand() de la classe ActionEvent
Richard Grin Interface graphique 130
![Page 131: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/131.jpg)
Solution 2 : classe interneSolution 2 : classe interne
S l i l ibl h (• Solution plus extensible : chaque composant (ou chaque type ou groupe de composants) a sa propre classe écouteur
• Le plus souvent la classe écouteur est une classe• Le plus souvent, la classe écouteur est une classe interne de la classe C
Richard Grin Interface graphique 131
![Page 132: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/132.jpg)
ExempleExemplepublic class Fenetre extends JFrame {public class Fenetre extends JFrame {
private JButton b1, b2;. . .public Fenetre() {
. . .ActionListener eb = new EcouteurBouton();b1.addActionListener(eb);b1 setActionCommand("b1");b1.setActionCommand( b1 ); b2.addActionListener(eb);b2.setActionCommand("b2"); . . .
}
Richard Grin Interface graphique 132
![Page 133: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/133.jpg)
Exemplep// Classe interne de Fenetreclass EcouteurBouton implements ActionListener {
public void actionPerformed(ActionEvent e) {String commande = e getActionCommand();String commande = e.getActionCommand();if (commande.equals("b1")) {
. . . // action liée au bouton b1}else if (commande.equals("b2")) {
. . . // action liée au bouton b2}
}Exemple d'utilisation degetActionCommand()}
}. . .
getActionCommand()
Richard Grin Interface graphique 133
![Page 134: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/134.jpg)
Solution 3 : classe interne anonymeSolution 3 : classe interne anonyme• Si la classe écoute un seul composant et ne• Si la classe écoute un seul composant et ne
comporte pas de méthodes trop longues, la l t l l t l i tclasse est le plus souvent une classe interne
anonyme• L’intérêt est que le code de l’écouteur est
proche du code du composantproche du code du composant• Rappel : une classe interne locale peut utiliser
l i bl l l l è d lles variables locales et les paramètres de la méthode, seulement s’ils sont final
Richard Grin Interface graphique 134
![Page 135: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/135.jpg)
E lExemple Instance d’une classeInstance d une classe
« anonyme » quiimplémente ActionListener
JButton ok = new JButton("OK");ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {// ti à é t// action à exécuter. . .
}}});
Richard Grin Interface graphique 135
![Page 136: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/136.jpg)
Événements clavierÉvénements clavier
Richard Grin Interface graphique 136
![Page 137: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/137.jpg)
Événements clavier• Un événement clavier de bas niveau est engendré
i l i d l ilipar une action élémentaire de l’utilisateur, par exemple, appuyer sur une touche du clavier (génère un appel à la méthode keyPressed() deKeyListener)y )
• Plusieurs actions élémentaires de l’utilisateur peuvent engendrer une seul événement de hautpeuvent engendrer une seul événement de haut niveau ; ainsi, appuyer et relâcher sur les touches Shift et A pour obtenir un A majuscule, génère un appel à la méthode keyTyped() de KeyListener
Richard Grin Interface graphique 137
pp
![Page 138: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/138.jpg)
KeyEvent• Cette classe correspond aux événements (evt)
d é l’ tili ti d l iengendrés par l’utilisation du clavier• 3 types d'événements repérés par evt.getID() :yp p p
– KeyEvent.KEY_PRESSED et KeyEvent.KEY_RELEASEDsont des événements de bas niveau et correspondent àsont des événements de bas niveau et correspondent à une action sur une seule touche du clavierKeyEvent KEY TYPED est un événement de haut niveau– KeyEvent.KEY_TYPED est un événement de haut niveau qui correspond à l’entrée d'un caractère Unicode (peut correspondre à une combinaison de touches commecorrespondre à une combinaison de touches comme Shift-A pour A)
Richard Grin Interface graphique 138
![Page 139: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/139.jpg)
KeyEventy
• Si on veut repérer la saisie d’un caractèreSi on veut repérer la saisie d un caractère Unicode, il est plus simple d’utiliser les événements de type KEY TYPEDévénements de type KEY_TYPED
• Pour les autres touches qui ne renvoient pas de caractères Unicode, telle la touche F1 ou les flèches, il faut utiliser les événements ,KEY_PRESSED ou KEY_RELEASED
Richard Grin Interface graphique 139
![Page 140: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/140.jpg)
KeyListenery
public interface KeyListenerpublic interface KeyListenerextends EventListener {
void keyPressed(KeyEvent e);void keyReleased(KeyEvent e);void keyTyped(KeyEvent e);
}}
• Si on n'est intéressé que par une des méthodes, on peut hériter de la classe KeyAdapterpeut hériter de la classe KeyAdapter
• Dans ces méthodes, on peut utiliser les méthodes h () (d k d) tgetKeyChar() (dans keyTyped) et
getKeyCode() (dans les 2 autres méthodes)Richard Grin Interface graphique 140
![Page 141: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/141.jpg)
Exemple de KeyListenerExemple de KeyListenerclass EcouteCaracteres extends KeyAdapter {class EcouteCaracteres extends KeyAdapter {public void keyTyped(KeyEvent e) {if ( tK Ch () ' ')if (e.getKeyChar() == 'q')quitter();
}}public void keyReleased(KeyEvent e) {if ( d () )if (e.getKeyCode() == KeyEvent.VK_ESCAPE)actionQuandEsc();
}
Richard Grin Interface graphique 141
![Page 142: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/142.jpg)
Événements sourisÉvénements souris
Richard Grin Interface graphique 142
![Page 143: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/143.jpg)
2 t pes d’éco te rs2 types d’écouteurs
• Un type d’événement MouseEvent pour 2 types d’écouteursyp
• MouseListener : bouton enfoncé ou relâché, li (b t f é t t t d it lâ hé)clic (bouton enfoncé et tout de suite relâché),
entrée ou sortie du curseur dans la zone d’un composant
• MouseMotionListener : déplacement ouMouseMotionListener : déplacement ou glissement (drag) de souris
Richard Grin Interface graphique 143
![Page 144: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/144.jpg)
Écouteur Mo seListenerÉcouteur MouseListenerL’i f i l• L’interface MouseListener contient les méthodes– mousePressed(MouseEvent)– mouseReleased(MouseEvent)mouseReleased(MouseEvent)– mouseClicked(MouseEvent)
d( )– mouseEntered(MouseEvent)– mouseExited(MouseEvent)
• Adaptateur MouseAdapter
Richard Grin Interface graphique 144
![Page 145: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/145.jpg)
Écouteur Mo seMotionListenerÉcouteur MouseMotionListenerL’i f• L’interface MouseMotionListenercontient les méthodes– mouseMoved(MouseEvent)– mouseDragged(MouseEvent)mouseDragged(MouseEvent)
• Adaptateur MouseMotionAdapter
Richard Grin Interface graphique 145
![Page 146: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/146.jpg)
Roulette de la sourisRoulette de la souris
i d j l• La version 1.4 du SDK a ajouté le type d’événement MouseWheelEvent, associé aux souris à roulettes
• Ces événement peuvent être pris en compte• Ces événement peuvent être pris en compte par les écouteurs MouseWheelListener
• Le composant ScollPane a un tel écouteur, ce qui permet de déplacer la vue en utilisant q p pla roulette de la souris
Richard Grin Interface graphique 146
![Page 147: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/147.jpg)
Traitement des MouseWheelEventTraitement des MouseWheelEvent
• Ce type d’événement a un traitementCe type d événement a un traitement particulier : l’événement est propagé au premier composant intéressé englobant lepremier composant intéressé, englobant le composant où est situé le curseur
• Le plus souvent aucun codage ne sera nécessaire pour traiter ce type d’événementsnécessaire pour traiter ce type d événements car le composant qui recevra l’événement sera un ScrollPane qui est d’origine codésera un ScrollPane qui est d origine codé pour le traiter
Richard Grin Interface graphique 147
![Page 148: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/148.jpg)
FocusFocus
Richard Grin Interface graphique 148
![Page 149: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/149.jpg)
• La gestion du focus a changé à partir du SDK 1.4
• Ce cours s’appuie sur la version 1 4Ce cours s appuie sur la version 1.4
Richard Grin Interface graphique 149
![Page 150: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/150.jpg)
Avoir le focusAvoir le focus
U l i l f à• Un seul composant peut « avoir le focus » à un moment donné
• C’est le composant qui va recevoir tous les caractères tapés au clavier par l’utilisateurcaractères tapés au clavier par l utilisateur
• La fenêtre qui « a le focus » est celle qui contient ce composant
• Un composant ne peut engendrer unUn composant ne peut engendrer un KeyEvent que s’il a le focus
Richard Grin Interface graphique 150
![Page 151: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/151.jpg)
Cycles pour obtenir le focusy p f• Les composants ont le focus à tour de rôle• Par exemple, quand l’utilisateur tape [Enter]
dans un champ de saisie, le composant p , p« suivant » obtient le focus
• Des touches spéciales permettent aussi deDes touches spéciales permettent aussi de passer d’un composant à l’autre ([Tab] et [Maj]-[Tab] sous Windows et sous Unix)[Tab] sous Windows et sous Unix)
• L’ordre est le plus souvent déterminé par la iti l’é d tposition sur l’écran des composants
• Il peut aussi être fixé par programmationRichard Grin Interface graphique 151
![Page 152: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/152.jpg)
Obtenir le focusObtenir le focus• 2 autres façons pour obtenir le focus• 2 autres façons pour obtenir le focus• Le plus souvent un composant obtient le focus
quand l’utilisateur clique sur lui• Il peut aussi l’obtenir par programmation avec laIl peut aussi l obtenir par programmation avec la
méthode boolean requestFocusInWindow()de la classe Component (meilleur quede la classe Component (meilleur que requestFocus du SDK 1.3)
Richard Grin Interface graphique 152
![Page 153: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/153.jpg)
Obtenir le focusObtenir le focus• Tous les composants ne peuvent avoir le focus• Tous les composants ne peuvent avoir le focus• En général les zones de saisie de texte peuvent
l’avoir mais pas les boutons ou les labels• Dans la classe ComponentDans la classe Component
– la méthode boolean isFocusable() permet de savoir si un composant peut l’avoirsavoir si un composant peut l avoir (isFocusTraversal en SDK 1.3)
t d difi– void setFocusable(boolean) permet de modifier cette propriété
Richard Grin Interface graphique 153
![Page 154: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/154.jpg)
Méthodes diversesMéthodes diverses• Dans la classe ComponentDans la classe Component,
– 2 méthodes pour passer au composant suivant é éd t t f tF tou précédent : transfertFocus et
transfertFocusBackward
d éth d é l l d– des méthodes pour gérer les cycles de passage de focus
• Dans la classe Window, beaucoup de méthodes diverses à utiliser si on veut gérer gle focus au niveau des fenêtres
Richard Grin Interface graphique 154
![Page 155: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/155.jpg)
Focus et KeyListener
• Si votre keyListener ne réagit pas, demandez vous si le composant qui est écouté a bien le focusf
• Vous pouvez utiliser pour cela la méthode b l i F O () de la classeboolean isFocusOwner() de la classe Component (hasFocus() du SDK 1.3 est
b lèt )obsolète)
Richard Grin Interface graphique 155
![Page 156: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/156.jpg)
FocusListener
• Écouteur pour savoir quand le focus change de main
• Méthodes focusGained et focusLostMéthodes focusGained et focusLost
Richard Grin Interface graphique 156
![Page 157: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/157.jpg)
Compléments : modifier lesCompléments : modifier lestouches de déplacement
• Les touches qui permettent de se déplacer entre les composants peuvent être modifiées en utilisant le KeyboardFocusManagery g
Richard Grin Interface graphique 157
![Page 158: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/158.jpg)
Compléments : modifier la ppolitique de déplacement
• L’ordre de déplacement peut être modifié en choisissant une politique de déplacementen choisissant une politique de déplacement
• Par défaut, sous Swing, l’ordre de déplacement dans un container dépend de la position sur l’écranp
• On peut choisir un autre ordre avec la méthode de la classe Containerméthode de la classe ContainersetFocusTraversalPolicy(
FocusTraversalPolicy policy)Richard Grin Interface graphique 158
FocusTraversalPolicy policy)
![Page 159: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/159.jpg)
Mé i i tMécanismes internes pour traiter les événementspour traiter les événements
Richard Grin Interface graphique 159
![Page 160: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/160.jpg)
Etapes du traitementp• Les événements sont
1. mis dans la file d’attente des événements2. récupérés un à un par le thread de distribution p p
des événements3 redistribués par le thread aux composants3. redistribués par le thread aux composants
concernés4 traités par les écouteurs concernés du4. traités par les écouteurs concernés du
composant (enregistrés auprès du composant)5 i é l5. traités par le composant pour son propre
compte
Richard Grin Interface graphique 160
![Page 161: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/161.jpg)
File d’attente des événementsFile d attente des événements
L é é t t d é l l• Les événements sont engendrés le plus souvent par une action de l’utilisateur
l tè d f êt tifperçue par le système de fenêtrage natif sous-jacent
• Les événements sont mis automatiquement par le système AWT dans la file d’attente p ydes événements (instance unique de la classe EventQueue)
Richard Grin Interface graphique 161
![Page 162: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/162.jpg)
Thread de distributionThread de distribution des événements
• Un thread unique (Event Dispatch Thread)1. récupère un à un les événements dans la file
d’attente des événements2. passe la main au composant concerné (appel
de dispatchEvent(AWTEvent) de la classede dispatchEvent(AWTEvent) de la classe Component)
• Ce thread est créé automatiquement dès qu’une• Ce thread est créé automatiquement dès qu une une classe de AWT est utilisée
Richard Grin Interface graphique 162
![Page 163: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/163.jpg)
Traitement des événementsTraitement des événements• Le composant fait appel à processEvent(e)Le composant fait appel à processEvent(e)
(classe Component) qui fait appel à la méthode appropriée :méthode appropriée :– processMouseEvent(MouseEvent) pour les
événements liés à la sourisévénements liés à la souris– processFocusEvent(FocusEvent) pour les
événements liés au focusévénements liés au focus– processKeyEvent(KeyEvent) pour ceux liés
à la frappe de touches du clavierà la frappe de touches du clavier– etc.
Richard Grin Interface graphique 163
![Page 164: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/164.jpg)
Appel des écouteursAppel des écouteursL l l é h d llb k• Le composant lance la méthode « callback » des écouteurs correspondant au type de l’événement (MouseClicked, KeyReleased, …)y , )
Richard Grin Interface graphique 164
![Page 165: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/165.jpg)
Consommation d’un InputEventConsommation d un InputEvent• Après avoir été traité par tous les écouteurs• Après avoir été traité par tous les écouteurs,
l’événement est traité par le composant lui-êmême
• Par exemple, un caractère tapé par l’utilisateur p , p psera affiché dans un JTextField
• Un écouteur d’un InputEvent (Mouse et Key• Un écouteur d un InputEvent (Mouse et KeyEvent) peut empêcher cette dernière étape en
l é é ( é h dconsommant l’événement (méthode consume() de la classe InputEvent)
Richard Grin Interface graphique 165
![Page 166: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/166.jpg)
Génération d’un événement
• On peut créer un événement par du code, nonOn peut créer un événement par du code, non provoqué par une action de l’utilisateur, pour l’envoyer directement à un certain composantl envoyer directement à un certain composant
• On le fait en 2 étapes :– créer l’événement– envoyer un message « dispatchEvent » auenvoyer un message « dispatchEvent » au
composant, avec l’événement créé en paramètre• Remarque : les événements de haut niveau tels que• Remarque : les événements de haut niveau tels que ActionEvent ne peuvent être simulés de cette façon
Richard Grin Interface graphique 166
![Page 167: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/167.jpg)
Exemple de génération p gd’un événement
• Dans un écouteur de menu (un ActionListener qui est ici la fenêtre quiActionListener qui est ici la fenêtre qui contient le menu), le code suivant simule la fermeture de la fenêtre par l’utilisateur (et sans doute la sortie de l’application) :sans doute la sortie de l application) :if (e.getActionCommand().equals("sortie"))dispatchEvent(new WindowEvent(
this, WindowEvent.WINDOW_CLOSING));
Richard Grin Interface graphique 167
![Page 168: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/168.jpg)
Swing et threads
Richard Grin Interface graphique 168
![Page 169: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/169.jpg)
Les différents threads dans un GUILes différents threads dans un GUI
h d i l l i f hi• Le thread qui lance l’interface graphique, qui peut initialiser l’environnement d’exécution du GUI
• Le thread de distribution des événements• Le thread de distribution des événements qui gère l’affichage et les traitements des é éévénements
• Les threads lancés en arrière-plan qui p qexécutent les tâches de longue durée
Richard Grin Interface graphique 169
![Page 170: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/170.jpg)
« Event dispatch thread »« Event dispatch thread »• Un seul thread appelé le thread de distributionUn seul thread appelé le thread de distribution
des événements (event dispatch thread) , nommé TDE dans la suite effectuenommé TDE dans la suite, effectue– la récupération des événements dans la file
d’attente – le traitement de ces événements (méthodesle traitement de ces événements (méthodes
des écouteurs)– l’affichage de l’interface graphique
Richard Grin Interface graphique 170
![Page 171: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/171.jpg)
Traitements longs des événements
• Tout traitement long effectué par ce threadfi l’i f hi i é d lfige l’interface graphique qui répond mal, ou même plus du tout, aux actions de l’utilisateur
• Il faut donc effectuer les traitements longs (accès à une base de données calculs ou(accès à une base de données, calculs ou dessins complexes,…) des écouteurs et des
éth d d’ ffi h d d h d à tméthodes d’affichage dans des threads à part
Richard Grin Interface graphique 171
![Page 172: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/172.jpg)
Swing n’est pas « thread-safe »Sw g es p s th ead safe• Pour des raisons de performance et dePour des raisons de performance et de
facilité de mise en œuvre par les programmeurs les composants de Swing neprogrammeurs, les composants de Swing ne sont pas prévus pour être utilisés par
l i â h êplusieurs tâches en même temps• Si un composant a déjà été affiché, tout code p j ,
qui modifie l’état (le modèle) du composant doit donc être exécuté par le thread dedoit donc être exécuté par le thread de distribution des événements
Richard Grin Interface graphique 172
![Page 173: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/173.jpg)
ProblèmeProblème• Comment faire si le traitement d’un
événement comporte une tâche longue à exécuter avant de modifier l’état d’unexécuter avant de modifier l état d un composant ?
• Par exemple, si les éléments d’une liste sont récupérés dans une base de donnéesp
• La solution : la tâche longue est exécutée dans un thread à part ; au moment de modifier leun thread à part ; au moment de modifier le composant, on passe la main au TDE
Richard Grin Interface graphique 173
![Page 174: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/174.jpg)
Modifier un composantModifier un composant depuis d’autres threads
• 2 méthodes utilitaires public static de la lclasse javax.swing.SwingUtilities
permettent de lancer des opérations qui modifient des composants de l’interface graphique depuis un autre thread que le threadgraphique depuis un autre thread que le thread de distribution des événements :
id i k L t (R bl runnable)– void invokeLater(Runnable runnable)– void invokeAndWait(Runnable runnable)
Richard Grin Interface graphique 174
![Page 175: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/175.jpg)
Utiliser d’autres threadsUtiliser d autres threads …• invokeLater dépose une tâche à accomplirinvokeLater dépose une tâche à accomplir
dans la file d’attente des événements ; la méthode retourne ensuite sans attendreméthode retourne ensuite sans attendre l’exécution de la tâche par le TDE
• Le TDE exécutera cette tâche comme tous les traitements d’événements
• invokeAndWait, dépose une tâche mais ne t l l tâ h t é téretourne que lorsque la tâche est exécutée par
le TDERichard Grin Interface graphique 175
![Page 176: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/176.jpg)
Utilisation de invokeLater• Le schéma est le suivant si on a un traitement
long à effectuer, qui a une interaction avec l’interface graphique :l interface graphique :– on lance un thread qui effectue la plus grande partie
de la tâche par exemple accès à une base de donnéede la tâche, par exemple, accès à une base de donnée et récupération des données
d difi l’i f hi– au moment de modifier l’interface graphique, ce thread appelle invokeLater() en lui passant un
i é l i i i èdRunnable qui exécutera les instructions qui accèdent ou modifient l’état du composant
Richard Grin Interface graphique 176
![Page 177: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/177.jpg)
Utilisation de invokeLater()l ffi h i t t d h d {class AfficheurListe extends Thread {private Runnable modifieurListe;private Collection donneesListe;pAfficheurListe(List l) {
modifieurListe = new Runnable() {p blic oid r n() {public void run() {. . .
} Modifie la liste en tili t d Li t}
}public void run() {
utilisant donneesListe
public void run() {// Remplit donneesListe avec les données // lues dans la base de données. . .SwingUtilities.invokeLater(modifieurListe);
}
Richard Grin Interface graphique 177
}
![Page 178: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/178.jpg)
invokeAndWait
• La différence avec invokeLater est que l’instruction qqui suit l’appel de invokeAndWait n’est lancée que lorsque la tâche est terminéeq
• On peut ainsi lancer un traitement et tenir compte des résultats pour la suite du traitement longrésultats pour la suite du traitement long
• Attention, invokeAndWait provoquera un blocage s’il est appelé depuis le event dispatch thread ; ça pourraitest appelé depuis le event dispatch thread ; ça pourrait arriver si on veut partager du code entre un écouteur et une méthode ; pour éviter ce problème, utiliser la méthode staticé ode ; pou év e ce p ob è e, u se é ode stat cEventQueue.isDispatchThread()
Richard Grin Interface graphique 178
![Page 179: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/179.jpg)
SwingWorker<T,V>
• La fin de cette section sur les threads dans le GUI présente la classe SwingWorker
• Cette classe a été introduite par Java 6 pourCette classe a été introduite par Java 6 pour faciliter l’utilisation de threads lancés en arrière plan dans les interfaces graphiquesarrière-plan dans les interfaces graphiques
Richard Grin Interface graphique 179
![Page 180: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/180.jpg)
Méthode abstraiteMéthode abstraite doInBackgroundg
• SwingWorker comprend la méthodeSwingWorker comprend la méthode abstraite doInBackground
• Cette méthode devra être définie dans une classe fille
• Elle sera exécutée en parallèle au TDE lorsque la méthode execute sera lancéelorsque la méthode execute sera lancée
Richard Grin Interface graphique 180
![Page 181: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/181.jpg)
Paramètres de typeParamètres de type• T : type du résultat final renvoyé par la• T : type du résultat final renvoyé par la
méthode doInBackground et récupéré avec l éth d ( Vla méthode get() (Void, avec un V majuscule, si rien n’est renvoyé)
• V : type des résultats intermédiaires renvoyés par la méthode doInBackground (Void sipar la méthode doInBackground (Void si rien n’est renvoyé)
Richard Grin Interface graphique 181
![Page 182: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/182.jpg)
Constructeur
• Un seul constructeur sans paramètre• Remarque : une instance de SwingWorker
n’est pas réutilisable ; il faut en recréer unen est pas réutilisable ; il faut en recréer une à chaque lancement d’une tâche en arrière-planplan
Richard Grin Interface graphique 182
![Page 183: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/183.jpg)
Principales méthodesPrincipales méthodes• void execute() : lance l’exécution devoid execute() : lance l exécution de doInBackground et retourne immédiatement
é â h• T doInBackground() : exécute une tâche en arrière-plan
• void done() : lancée automatiquement par le SwingWorker juste après la fin dele SwingWorker juste après la fin de l’exécution de doInBackground ; cette
éth d t é té l TDEméthode est exécutée par le TDE
Richard Grin Interface graphique 183
![Page 184: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/184.jpg)
Méthode getMéthode get
T t() é è l é lt t d l éth d• T get() : récupère le résultat de la méthode doInBackground
• Une variante de get n’attend pas plus qu’un certain temps indiqué par 2 paramètres ; par p q p p ; pexemple, get(10, TimeUnit.MILLISECONDS);get(10, TimeUnit.MILLISECONDS);n’attendra pas plus de 10 millisecondes
Richard Grin Interface graphique 184
![Page 185: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/185.jpg)
Exceptions lancées par getExceptions lancées par get• Si get a été interrompue pendant qu’elle était en• Si get a été interrompue pendant qu elle était en
attente du résultat, elle lance une java.lang.InterruptedExceptionjava.lang.InterruptedException
• Si doInBackground a lancé une exception, getl E ti E ti ( tlance une ExecutionException (paquetage java.util.concurrent) ; l’exception initiale est d é ddonnée par getCause() de Throwable
• Si doInBackground a été interrompue (par cancelétudié dans le transparent suivant), get lance une CancellationException (java.util.concurrent)
Richard Grin Interface graphique 185
( )
![Page 186: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/186.jpg)
Méthode cancelMéthode cancel• boolean cancel(boolean interrompt) :• boolean cancel(boolean interrompt) :
essaie d’arrêter l’exécution en arrière-plan de d I B k ddoInBackground
– le paramètre est true pour indiquer de stopper la tâche en arrière-plan, même si elle a déjà démarré
– si le paramètre est à false, une tâche déjà p jdémarrée n’est pas stoppée ; mais si le message est envoyé avant le démarrage de cette tâche, la y gtâche ne sera jamais exécutée
Richard Grin Interface graphique 186
![Page 187: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/187.jpg)
Méthode isCancelled
• La méthode isCancelled renvoie true, si la tâche a été interrompue avant sa finla tâche a été interrompue avant sa fin normale
Richard Grin Interface graphique 187
![Page 188: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/188.jpg)
Méthodes bli h etMéthodes publish et process
• void publish(V… resultsInt) : à utiliser dans doInBackground pour publier g p pdes résultats intermédiaires ; ne pas la redéfinirredéfinir
• void process(List<V> resultsInt) : reçoit les résultats intermédiaires envoyés par publish (exécuté par le TDE) ; à p ( p )redéfinir si on souhaite traiter ces résultats intermédiaires
Richard Grin Interface graphique 188
intermédiaires
![Page 189: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/189.jpg)
PropriétésPropriétés• Comme avec les Java beans, SwingWorker
peut communiquer avec d'autres objets par l'intermédiaire de propriétés liées au sens p pdes Java beans (bounded)Si é t ’i it• Si un écouteur s’inscrit comme PropertyChangeListener, il reçoit un événement à chaque fois que firePropertyChange est lancée pour p y g pindiquer qu’une propriété a reçu une nouvelle valeur
Richard Grin Interface graphique 189
nouvelle valeur
![Page 190: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/190.jpg)
Gestion des écouteurs• void addPropertyChangeListener(PropertyChaddPropertyChangeListener(PropertyChangeListener l) : ajoute un écouteur
• void removePropertyChangeListener(PropertyChangeListener l) : enlève un écouteur
• void firePropertyChange(String o d e ope tyC a ge(St gnomPropriété, Object ancienneValeur, Object nouvelleValeur) : avertit lesObject nouvelleValeur) : avertit les écouteurs du changement de valeur d’une
iétéRichard Grin Interface graphique 190propriété
![Page 191: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/191.jpg)
2 propriétés prédéfinies2 propriétés prédéfinies• state : prend sa valeur dans l’énumérationstate : prend sa valeur dans l énumération SwingWorker.StateValue, PENDING(avant le démarrage de d I B k d)(avant le démarrage de doInBackground), STARTED (après le démarrage de doInBackground), DONE (après la fin de l’exécution de doInBackground))
• progress : a une valeur de 0 à 100 ; peut servir à indiquer la progression de la tâcheservir à indiquer la progression de la tâche en arrière-plan
Richard Grin Interface graphique 191
![Page 192: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/192.jpg)
Méthodes pour les propriétés etMéthodes pour les propriétés et l’état du SwingWorker
• SwingWorker.StateValue getState()i ()• int getProgress()
• protected void setProgress(int v)
• boolean isCancelled() : true si la méthode cancel a été appelée pourméthode cancel a été appelée pour interrompre la tâche
• boolean isDone() : true si la méthode doInBackground a fini son exécution
Richard Grin Interface graphique 192
![Page 193: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/193.jpg)
Threads pour les différentes méthodesThreads pour les différentes méthodesé é d l h d• execute est exécuté dans le thread courant
• doInBackground est exécuté en arrière-plando ac g ou d es e écu é e è e p• process et done et toutes les notifications
d t Ch i t t l édes PropertyChangeListeners sont lancés par SwingWorker dans le TDE pour mettre à jour l’interface ; il est donc possible et sûr d’y modifier l’interface graphiquey g p q
Richard Grin Interface graphique 193
![Page 194: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/194.jpg)
Threads pour les différentes méthodesThreads pour les différentes méthodest d it êt lé d l éth d• get ne doit être appelé que dans la méthode
done, sinon elle risque de bloquer le TDE• Si on veut bloquer le TDE en attente du
résultat final par get il faut le fairerésultat final par get, il faut le faire autrement, en affichant une fenêtre de dialogue pour prévenir l’utilisateur (voirdialogue pour prévenir l utilisateur (voir javadoc de get)
Richard Grin Interface graphique 194
![Page 195: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/195.jpg)
Cas d’utilisation (1)( )• Si l’interface doit charger des ressources avant
d’être totalement opérationnelle ; elle peutd être totalement opérationnelle ; elle peut– charger les ressources dans le thread
principal (celui qui lance l'interface graphique), mais alors l’interface ne s’affichera pas tout de suite
– faire charger les ressources par le TDE, g p ,mais alors l’interface restera figée pendant ce chargementce chargement
• La solution est de faire charger les ressources par un swingworker
Richard Grin Interface graphique 195
par un swingworker
![Page 196: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/196.jpg)
Cas d’utilisation (2)( )
• Le cas d’utilisation le plus fréquent est de p qlancer une tâche longue à exécuter dans un écouteur à la suite d’une action de l’utilisateurécouteur, à la suite d une action de l utilisateur
• La tâche longue est exécutée par la méthode doInBackground
• A la suite de cette exécution, si l’interface doit ,être mise à jour, la méthode done s’en charge (exécutée par le TDE)(exécutée par le TDE)
Richard Grin Interface graphique 196
![Page 197: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/197.jpg)
Cas d’utilisation (3)( )
• Si l’interface doit être mise à jour durant jl’exécution de la tâche, la méthode processs’en charge (exécutée par le TDE)s en charge (exécutée par le TDE)
• Remarque : rien n’assure que toutes les tâches exécutées par process seront exécutées avant le démarrage de done. Si on veut cette gfonctionnalité, il faut la programmer (pas facile voir cours sur les threads)facile, voir cours sur les threads)
Richard Grin Interface graphique 197
![Page 198: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/198.jpg)
Schéma d’utilisation (début)( )class Tache extends
SwingWorker<Integer Integer>() {SwingWorker<Integer, Integer>() { @Overridepublic Integer doInBackground() {public Integer doInBackground() {int val = 0; boolean fini = false;while (!fini) {( ) {val += calculLong();publish(val);pfini = ...;
}return val;
}
Richard Grin Interface graphique 198
}
![Page 199: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/199.jpg)
Schéma d’utilisation (suite)( )@Overridepublic void done() {public void done() {try {
int val = get();int val = get(); // Met à jour le GUI avec la valeur...
}// T it l ti// Traiter les exceptions, // en particulier l’interruption de// l tâ h (C ll ti E ti )// la tâche (CancellationException)catch(...)
Richard Grin Interface graphique 199}
![Page 200: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/200.jpg)
Schéma d’utilisation (fin)( )@Override
bli id (Li t<I t > l ) {public void process(List<Integer> vals) {// Met à jour le GUI avec les valeurs...
}//} // classe Tache
// Utilisation du SwingWorker dans le GUIpublic void actionPerformed(ActionEvente) {
T h t h T h ()Tache tache = new Tache();tache.execute();
}Richard Grin Interface graphique 200}
![Page 201: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/201.jpg)
A hit t d li tiArchitecture des applicationsavec interface graphiqueavec interface graphique
Richard Grin Interface graphique 201
![Page 202: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/202.jpg)
Séparation du GUI etSéparation du GUI et des classes métier
• Les classes métier doivent être indépendantes des interfaces graphiques qui les utilisent
• L’architecture est la suivante :L architecture est la suivante :– classes métier (dans un paquetage)
l l i f hi ( ) (d– classes pour l’interface graphique (GUI) (dans un autre paquetage)
– les écouteurs du GUI font appel aux méthodes des classes métier
Richard Grin Interface graphique 202
![Page 203: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/203.jpg)
Classe « principale » schématiqueClasse « principale » schématiquepublic class Application {public class Application {. . .bli t ti id i (St i [] ) {public static void main(String[] args) {// Initialisation (utilise classes métier). . .// Affiche la fenêtre principale du GUIi ili i i k ( )SwingUtilities.invokeLater(...);
}Les traitements de fin éventuels sur les classes} Les traitements de fin éventuels sur les classesmétiers peuvent être placés dans les écouteursau moment de quitter le GUI
Richard Grin Interface graphique 203
q
![Page 204: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/204.jpg)
Pattern MVC en Swingg
Richard Grin Interface graphique 204
![Page 205: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/205.jpg)
Modèle de conception MVCModèle de conception MVC• Le pattern MVC (Modèle-Vue-Contrôleur) estLe pattern MVC (Modèle Vue Contrôleur) est
utilisé par Swing pour modéliser les composants graphiques qui contiennent des données (listesgraphiques qui contiennent des données (listes, tables, arbres,…) :– le modèle contient les données– les vues donnent différentes vues des données (ou (
d’une partie des données) du modèle à l’utilisateur – le contrôleur traite les événements reçus par lele contrôleur traite les événements reçus par le
composant graphique
Richard Grin Interface graphique 205
![Page 206: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/206.jpg)
Architecture MVC• gère les données
Modèle< update < change Evénements
getData >Vue ContrôleurgetData >
< changechange• donne une vue d’une
partie des données• observe le modèle
• traite les événements
Richard Grin Interface graphique 206
observe le modèle
![Page 207: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/207.jpg)
Architecture MVC
Modèle< change Evénements< update
getData >Vue ContrôleurgetData >(optionnel)
Les vues écoutent le modèle
Richard Grin Interface graphique 207
![Page 208: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/208.jpg)
Variante architecture MVC
Modèle< change Evénements
getData >Vue ContrôleurgetData >
< changechange
Richard Grin Interface graphique 208
![Page 209: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/209.jpg)
Exemple de processus engendré par une action de l'utilisateur
1. Le contrôleur reçoit un événement2 Il informe le modèle (change)2. Il informe le modèle (change)3. Celui-ci modifie ses données en conséquence4. Le contrôleur informe la vue d'un changement
(change)(change)5. La vue demande au modèle les nouvelles
données (getData)6. La vue modifie son aspect visuel en conséquence
Richard Grin Interface graphique 209
6. La vue modifie son aspect visuel en conséquence
![Page 210: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/210.jpg)
UI-delegateUI-delegate• Pour représenter ses composants graphiques• Pour représenter ses composants graphiques,
Swing utilise une variante de MVC où t ôl t t é i d bj t UIcontrôleur et vue sont réunis dans un objet UI-
delegate qui donne le look and feel du composant
• Un look and feel est constitué de tous les objetsUn look and feel est constitué de tous les objets UI-delegate associés
Richard Grin Interface graphique 210
![Page 211: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/211.jpg)
Pattern « fabrique abstraite »Pattern « fabrique abstraite »• Le changement de look and feel utilise leLe changement de look and feel utilise le
modèle de conception (design pattern) « fabrique abstraite » qui permet de choisir une« fabrique abstraite » qui permet de choisir une famille de classes indépendamment du reste de l’applicationl application
• Chaque look and feel correspond à une fabrique d’ t i t d UI d l t ( é é ld’un certain type de UI-delegate (gérée par le UI-manager)
• Pour changer de look and feel, il suffit de changer de fabriqueRichard Grin Interface graphique 211
![Page 212: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/212.jpg)
« Pluggable Look and feel »« Pluggable Look and feel »• Pour changer de look and feel pour l’ensemble• Pour changer de look and feel pour l ensemble
des composants contenus dans un composant :UIM tL kA dF l(UIManager.setLookAndFeel(
"javax.swing.plaf.metal.MetalLookAndFeel");// Change pour les composants déjà affichés// g p p jSwingUtilities.updateComponentTreeUI(
fenetre);
Richard Grin Interface graphique 212
![Page 213: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/213.jpg)
Architecture avec UI-delegateArchitecture avec UI-delegate
• Le composant• Le composant– est l’interlocuteur pour les objets extérieurs– contient le code pour les comportements de base du
composant– reçoit les événements (générés par le système)
• Le modèle contient les données• Le modèle contient les données
Richard Grin Interface graphique 213
![Page 214: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/214.jpg)
Architecture avec UI-delegate (2)Architecture avec UI-delegate (2)
L UI d l• Le UI-delegate– représente une façon de voir ces données et de
traiter les événements– écoute le composant (pour traiter les événements en écou e e co pos (pou e es évé e e s e
tant que contrôleur) ; il contient des classes internes auxquelles il délègue ce traitementq g
– écoute le modèle (pour afficher une vue de ce modèle)modèle)
Richard Grin Interface graphique 214
![Page 215: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/215.jpg)
Architecture avec UI delegateEvénement
écouteurs internes (parexemple, pour dessiner
UI delegate
p , pun bouton « enfoncé »)
Composant Ecouteursupdate >
h >p< change change >
M dèlchange > < getData
Modèle< update update >
Richard Grin Interface graphique 215
![Page 216: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/216.jpg)
Un exemple pd’utilisation des modèles :
les listes
Richard Grin Interface graphique 216
![Page 217: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/217.jpg)
Utilisation explicite du modèlep• Le modèle des composants n’est pas
t j tili é li it t d l dtoujours utilisé explicitement dans le code• Il est souvent caché par les implémentations
utilisées dans le cas les plus simples (boutons par exemple)
• Il n’est pas caché pour les composants comme les listes (JList), tables (JTable) co e es stes (J st), tab es (J ab e)ou arbres (JTree)
• Dans le cas des listes l’utilisation explicite• Dans le cas des listes, l utilisation explicite du modèle n'est indispensable que lorsqu’on veut modifier des éléments particuliers
Richard Grin Interface graphique 217
veut modifier des éléments particuliers
![Page 218: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/218.jpg)
Listes• Une liste permet de présenter une liste de choix
l ilià l’utilisateur :
• Celui-ci peut cliquer sur un ou plusieurs choix
Richard Grin Interface graphique 218
![Page 219: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/219.jpg)
Barre de défilement pour les listesBarre de défilement pour les listesL l li d b d• Le plus souvent une liste a des barres de défilement ; pour cela, il faut insérer la liste dans un ScrollPane :JScrollPane sList = new JScrollPane(uneListe);
• Par défaut 8 éléments de la liste sont• Par défaut, 8 éléments de la liste sont visibles ; on peut modifier ce nombre :uneListe setVisibleRowCount(5);uneListe.setVisibleRowCount(5);
Richard Grin Interface graphique 219
![Page 220: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/220.jpg)
Mode de sélectionMode de sélection• L’utilisateur peut sélectionner un ou plusieursL utilisateur peut sélectionner un ou plusieurs
éléments de la liste suivant le mode de sélection de la liste :de la liste :– SINGLE_SELECTIONSINGLE INTERVAL SELECTION– SINGLE_INTERVAL_SELECTION
– MULTIPLE_INTERVAL_SELECTION (mode par défaut)uneListe.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);
Richard Grin Interface graphique 220
![Page 221: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/221.jpg)
Constructeurs simples
• 2 constructeurs simples pour des listes :bli i ( bj [] li )public JList(Object[] listData)
public JList(Vector<?> listData)
• Il est possible de changer « en bloc » les données des ces listes par les méthodesdes ces listes par les méthodespublic setListData(Object[] listData)public setListData (Vector<?>public setListData (Vector<?> listData)
Richard Grin Interface graphique 221
![Page 222: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/222.jpg)
Afficher les éléments des listesAfficher les éléments des listes
U li ffi h élé ili• Une liste affiche ses éléments en utilisant toString() (elle sait aussi afficher des instances de ImageIcon)
• On peut aussi programmer des affichagesOn peut aussi programmer des affichages particuliers avec un « renderer » (setCellRenderer(ListCellRenderer))(setCellRenderer(ListCellRenderer))
Richard Grin Interface graphique 222
![Page 223: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/223.jpg)
Exemple de listeExemple de listeJList liste = new JList(new String[]
{"Un", "Deux", "Trois", "Quatre", …});JScrollPane sp = new JScrollPane(liste);liste.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);// Pour cet exemple, la classe est l'écouteur
li dd i l i i ( hi )liste.addListSelectionListener(this);// Ajoute le scrollPane dans le container,// ce qui ajoutera la liste// ce qui ajoutera la liste
c.add(sp);
Richard Grin Interface graphique 223
![Page 224: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/224.jpg)
Utilisation standard d’une listeUtilisation standard d une liste• Il est rare d’écrire un écouteur de liste• Il est rare d écrire un écouteur de liste• L’utilisation standard d’une liste est de
demander à l’utilisateur de cliquer sur un bouton lorsqu’il a fini de faire ses choix dans la listeq
• On récupère alors la sélection de l’utilisateur par une des méthodes getSelectedValue() ouune des méthodes getSelectedValue() ou getSelectedValues() dans la méthode
d l’é d bactionPerformed() de l’écouteur du bouton
Richard Grin Interface graphique 224
![Page 225: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/225.jpg)
Écouteur d’une liste• La classe d’un écouteur de liste doit implémenter
l’i t f Li tS l ti Li t i ti tl’interface ListSelectionListener qui contient la méthodevoid valueChanged(ListSelectionEvent e)
• Attention, une nouvelle sélection engendre 2, gévénements :
un pour désélectionner la précédente sélection– un pour désélectionner la précédente sélection – l’autre pour informer de la nouvelle sélection– getValueIsAdjusting() renvoie vrai pour le
premier événement qu’on ignore le plus souvent
Richard Grin Interface graphique 225
![Page 226: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/226.jpg)
Exemple d’écouteur d’une listepublic class EcouteurListe
implements ListSelectionListener
p
implements ListSelectionListenerpublic void valueChanged(ListSelectionEvent e) {
// On ignore les désélectionsif ( tV l I Adj ti ()) tif (e.getValueIsAdjusting()) return;// On traite les sélectionsJList source = (JList)e.getSource();// getSelectedValue() si un seul choix possibleObject[] choix = source.getSelectedValues();for (int i = 0; i < choix.length; i++) {g
// Ajoute les choix dans une zone de textetextArea.append(choix[i] + "\n");
}}}
}
Richard Grin Interface graphique 226
![Page 227: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/227.jpg)
Listes avec modèle expliciteListes avec modèle explicite
• Une liste peut être associée à un modèle• Une liste peut être associée à un modèle explicite qui fournit les données affichées
l lipar la liste• Ce modèle est une instance d’une classe quiCe modèle est une instance d une classe qui
implémente l’interface ListModelO t it l li t l t t• On construit la liste avec le constructeurpublic JList(ListModel modele)
Richard Grin Interface graphique 227
![Page 228: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/228.jpg)
Modèle de données pour une listepublic interface ListModel {
int getSize();
i = 0 pour le 1er
élément de la listeg ();Object getElementAt(int i);void addListDataListener(ListDataListener l);void removeListDataListener(ListDataListener l);void removeListDataListener(ListDataListener l);
}
• Pour faciliter l’écriture d’une classe quiPour faciliter l écriture d une classe qui implémente ListModel, le JDK fournit la classe abstraite Ab t tLi tM d l qui implémente lesabstraite AbstractListModel qui implémente les 2 méthodes de ListModel qui ajoutent et enlèvent les écouteurs
Richard Grin Interface graphique 228
![Page 229: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/229.jpg)
Listes avec modèle simpleListes avec modèle simple
• Les plus simples ont un modèle de la classe• Les plus simples ont un modèle de la classe DefaultListModel qui hérite de la classe AbstractListModel
• Avec DefaultListModel on gère lesAvec DefaultListModel on gère les données avec des méthodes semblables aux méthodes dd et des collections :méthodes add et remove des collections : add(int, Object), addElement(Object), remove(int), removeElement(Object), clear()
Richard Grin Interface graphique 229
j
![Page 230: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/230.jpg)
Exemple de liste modifiable simpleExemple de liste modifiable simple
pays = new DefaultListModel();pays.addElement("France");pays.addElement("Italie");pays.addElement("Espagne");pays.addElement("Maroc");
liste = new JList(pays);
Richard Grin Interface graphique 230
![Page 231: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/231.jpg)
Listes plus complexes
• On peut ne pas vouloir enregistrer tous les éléments de la liste en mémoire centrale
• Le modèle héritera alors directement de laLe modèle héritera alors directement de la classe AbstractListModel
Richard Grin Interface graphique 231
![Page 232: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/232.jpg)
Liste modifiable sans enregistrement physique des données
/** 1000 i i l/** Les 1000 premiers entiers composent le* modèle de données de la liste */
class Entiers1000 extends AbstractListModel {class Entiers1000 extends AbstractListModel {public int getSize() {
return 1000;}public Object getElementAt(int n) {
t I t ( + 1)return new Integer(n + 1);}
}}. . .JList liste = new JList(new Entiers1000());
Richard Grin Interface graphique 232
![Page 233: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/233.jpg)
Un exemple fréquent d’utilisationUn exemple fréquent d utilisation
• Souvent la valeur affichée par la liste n’est pas celle qui sera directement utilisée par lepas celle qui sera directement utilisée par le reste du programme
l l’ ili él i l• Par exemple, l’utilisateur sélectionne le nom d’un service et le reste du programme travaille avec le code de ce service
Richard Grin Interface graphique 233
![Page 234: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/234.jpg)
Un exemple fréquent d’utilisation (2)Un exemple fréquent d utilisation (2)
• Le plus simple est que la méthode toString de la classe Service renvoie cetoString de la classe Service renvoie ce qui doit être affiché par la listeL é h d• La méthode getSelectedValue va renvoyer une instance de Service et il est alors facile de récupérer le code du service en interrogeant cette instanceen interrogeant cette instance
Richard Grin Interface graphique 234
![Page 235: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/235.jpg)
Dessiner
Richard Grin Interface graphique 235
![Page 236: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/236.jpg)
Classe GraphicsClasse Graphics
L’ ffi h d’ t ff t é• L’affichage d’un JComponent est effectué par la méthode paintComponent(Graphics g)
• g contient le contexte graphique dans lequel se fait l’affichagefait l affichage
• Cette instance est passée en paramètre par le système graphique Java à la méthode paintComponent()
Richard Grin Interface graphique 236
![Page 237: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/237.jpg)
Ce que contient un GraphicsCe que contient un Graphics• « endroit » où afficher• « endroit » où afficher• zone de « clip » (l’utilisateur peut restreindre la zone
d t il)de travail)• couleur de tracé et couleur « XOR »• fonte• mode de tracé : mode « normal » ou mode « XOR »mode de tracé : mode « normal » ou mode « XOR »
dans lequel les nouveaux tracés se tracent en changeant les pixels de la couleur de tracé actuelle enchangeant les pixels de la couleur de tracé actuelle en la couleur de XOR, et vice-versa
Richard Grin Interface graphique 237
![Page 238: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/238.jpg)
Dessiner dans quel composant ?Dessiner dans quel composant ?
O t d i d t t i il• On peut dessiner dans tout JComponent mais il est recommandé de dessiner dans un JPanel(avec un JComponent, le fond d’écran risque donc de ne pas être repeint lorsqu’il le faut)
• Pour dessiner, on crée une classe qui hérite de JPanel dans laquelle on redéfinit la méthodeJPanel, dans laquelle on redéfinit la méthode paintComponent(), avec le code du dessin
Richard Grin Interface graphique 238
![Page 239: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/239.jpg)
Écriture de la méthodeÉcriture de la méthode paintComponent()
• La méthode paintComponent(Graphics g)d i idoit avoir « super.paintComponent(g) » comme première instruction
• Cela permet à la méthode paintComponent()de la classe JPanel d’effectuer sa part dude la classe JPanel d effectuer sa part du travail (en particulier peindre le fond d'écran)
Richard Grin Interface graphique 239
![Page 240: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/240.jpg)
Précaution à prendre quand onPrécaution à prendre quand on redéfinit paintComponent()
• Attention ! il est souvent indispensable de redéfinir les méthodes getPreferredSize()et getMinimumSize() du composant qui g () p qredéfinit la méthode paintComponent()(composant setSize() ne marche pas dans(composant.setSize() ne marche pas dans ce cas)
• On peut aussi utiliser la méthode setPreferredSize(Dimension) pour cela
Richard Grin Interface graphique 240
p
![Page 241: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/241.jpg)
Dimensionner un composantDimensionner un composant
tSi détermine les ale rs des ariables• setSize détermine les valeurs des variables internes associées à la dimension d’un composant
• Cette méthode ne convient pas toujours pour dimensionner un composant interne à une fenêtre
• En effet, les gestionnaires de placement utilisent les méthodes get{Preferred|Minimum}Sizeles méthodes get{Preferred|Minimum}Sizequi peuvent ne pas tenir compte des valeurs internes pour l’affichage d’un composant (parinternes pour l affichage d un composant (par exemple un bouton ne tient compte que de la taille de son texte)
Richard Grin Interface graphique 241
)
![Page 242: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/242.jpg)
Dessiner avec la classe GraphicsDessiner avec la classe Graphics
• Graphics offre plusieurs méthodes pour afficher divers éléments :– drawString() affiche du textedrawImage() affiche une image– drawImage() affiche une image
– drawLine() affiche un segment– fillOval() affiche une ellipse– drawPolygon() affiche un polygoneyg p yg– …
Richard Grin Interface graphique 242
![Page 243: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/243.jpg)
Système de coordonnéesy
• L’ unité est le pixel et l’origine est placée en• L unité est le pixel et l origine est placée en haut à gauche du composant dans lequel on ffi haffiche
Richard Grin Interface graphique 243
![Page 244: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/244.jpg)
Surface disponible pour l’affichagep p gInsets insets = getInsets(); x(0, 0)
insets.top
insets.rightinsets.left Surface d’affichaged t
getHeight()
du composant (on enlève la place
l b d )pour les bordures)
insets.bottom
getWidth()
Bord du composant
Richard Grin Interface graphique 244
getWidth()y
![Page 245: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/245.jpg)
Surface disponible pour l’affichageSurface disponible pour l affichagepublic void paintComponent(Graphics g) {
...Insets insets = getInsets();int largeurDisponible =int largeurDisponible =
getWidth() - insets.left - insets.right;int hauteurDisponible = p
getHeight() - insets.top - insets.bottom;.../* Peindre dans le rectangle défini par les points (insets.left, insets.height) et(getWidth()-insets right getHeight()-insets bottom)(getWidth()-insets.right, getHeight()-insets.bottom)
*/}
Richard Grin Interface graphique 245
![Page 246: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/246.jpg)
« Dessiner » du texte« Dessiner » du textepublic Fenetre() {
. . .this.add(new HelloWorldComponent());. . .
}
class HelloWorldComponent extends JPanel {@Override@public void paintComponent(Graphics g) {
super.paintComponent(g);g.drawString("Hello world!", 75, 100);
}}
Ajouter getPreferredSize si nécessaire
Richard Grin Interface graphique 246
}
![Page 247: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/247.jpg)
Dessinerpublic void paintComponent(Graphics g) {
i tC t( )super.paintComponent(g);g.drawRect(10, 50, 100, 80);Color couleur = g.getColor();Color couleur g.getColor();g.setColor(Color.green);g.fillRect(20, 60, 50, 40);g.drawOval(5, 40, 110, 110);g.setColor(couleur);
d P l (g.drawPolygon(new int[] {200, 210, 250, 280, 200},new int[] {110, 120, 60, 200, 300},new int[] {110, 120, 60, 200, 300},5);
}
Richard Grin Interface graphique 247
![Page 248: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/248.jpg)
Restreindre la zone de traitementRestreindre la zone de traitement• On peut restreindre la zone sur laquelle• On peut restreindre la zone sur laquelle
s’appliqueront les ordres que l’on envoie à un G hiGraphics,
• Les méthodes setClip permettent de donner p pune zone rectangulaire, ou même une zone quelconque délimitée par une forme (Shape)quelconque délimitée par une forme (Shape)
• Cette zone peut être obtenue parl é h d (la méthode getClip (getClipBounds pour obtenir le rectangle circonscrit à la forme)Richard Grin Interface graphique 248
![Page 249: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/249.jpg)
Classe Graphics2DClasse Graphics2D• En fait, la méthode paintComponent reçoit , p p ç
une instance de la classe Graphics2D, sous-classe de Graphicsp
• Graphics2D offre beaucoup plus de possibilités que Graphicspossibilités que Graphics
• Parmi les possibilités les plus simples, elle t l t ti l i à l’é h ll lpermet les rotations, les mises à l’échelle, le
choix de la largeur de trait, le tracé de l 3Drectangle 3D
Richard Grin Interface graphique 249
![Page 250: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/250.jpg)
Classe Graphics2DClasse Graphics2D
P ili ibili é il ffi d• Pour utiliser ces possibilités, il suffit de caster en Graphics2D le paramètre de paintComponent :Graphics2D g2 = (Graphics2D)g;
Richard Grin Interface graphique 250
![Page 251: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/251.jpg)
« Rendre » un Graphicsp
• Un Graphics est une ressource système qu’il faut rendre avec la méthode dispose() (classe Graphics) quand on n’en a plus besoin
• On ne doit rendre que les Graphics que l’on a obtenu par une méthode telle que getGraphicsobtenu par une méthode telle que getGraphicsou createGraphics
• Il faut laisser cette responsabilité aux méthodes• Il faut laisser cette responsabilité aux méthodes appelantes si on travaille avec un Graphics que l’on a reçu en paramètre d’une méthode telle quel on a reçu en paramètre d une méthode telle que paint ou paintComponent
Richard Grin Interface graphique 251
![Page 252: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/252.jpg)
Java2DJava2D• Les possibilités de base pour dessiner fournies par• Les possibilités de base pour dessiner fournies par
le SDK sont étendues énormément par Java 2D apparue avec le SDK 1.2pp
• Java 2D apporte à la fois plus de souplesse et de nombreuses nouvelles fonctionnalités
• Java 2D utilise des classes de java.awt, java.awt.color, java.awt.font, j , j ,java.awt.geom, java.awt.image et java.awt.print
• Nous n’étudierons pas Java2D dans ce cours
Richard Grin Interface graphique 252
![Page 253: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/253.jpg)
Faire se redessiner un composantFaire se redessiner un composant• On envoie le message repaint() au composantOn envoie le message repaint() au composant
(hérité de la classe Component)• Pour les dessins complexes, on peut gagner en performance siPour les dessins complexes, on peut gagner en performance si
la zone à redessiner est incluse dans un rectangle, en indiquant à la méthode repaint() le rectangle à redessiner :repaint(x, y, largeur, hauteur)
• Si repaint ne suffit pas pour faire afficher correctement les composants mais que tout s’affiche correctement après avoir redimensionné la fenêtre, il f d j l à lfaut sans doute ajouter avant repaint un appel à la méthode revalidate sur le composant à réafficher
Richard Grin Interface graphique 253
![Page 254: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/254.jpg)
revalidate invalidate validaterevalidate, invalidate, validate
• invalidate() rend « non correct » le• invalidate() rend « non correct » le composant qui reçoit le message, et tous les composants qui le contiennentcomposants qui le contiennent
• validate() envoyé à un container, lui indique ’il d i é iqu’il doit réorganiser ses composants (il ne tient
compte que des modifications des composants qui se dé l t t )déclarent « non corrects »)
• revalidate() envoyé à un composant, j dconjugue un invalidate() du composant et un
validate() de son containerRichard Grin Interface graphique 254
![Page 255: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/255.jpg)
Couleurs et polices de caractères
• On peut utiliser les classes Color et Fontpour améliorer la qualité de l’interface
Richard Grin Interface graphique 255
![Page 256: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/256.jpg)
Couleurs et polices de caractèresExemple
public void paintComponent(Graphics g) {public void paintComponent(Graphics g) { super.paintComponent(g);Font f = new Font("SansSerif", Font.BOLD, 14);Font fi = new Font("SansSerif",
Font.BOLD + Font.ITALIC, 14);g.setFont(f);g.setColor(Color.red); setBackground(Color blue); // couleur de fondsetBackground(Color.blue); // couleur de fondg.drawString("Hello world!", 75, 100);g.drawImage(image, 100, 75, null);g.setFont(fi);g.drawString("Hello world!", 75, 200);
Richard Grin Interface graphique 256}
![Page 257: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/257.jpg)
Calcul de la taille d’un texteCalcul de la taille d un texte• On peut avoir besoin de calculer la taille d’un• On peut avoir besoin de calculer la taille d un
texte en pixels, par exemple pour le centrerC t de la classe Component• Centrer un message :FontMetrics fm = getFontMetrics(getFont());int hauteurTexte = fm.getHeight();
de la classe Component
int hauteurTexte fm.getHeight();int largeurTexte = fm.stringWidth(msg);g.drawString( msg,
(int) ((largeur largeurTexte) / 2)(int) ((largeur - largeurTexte) / 2),(int) ((hauteur - hauteurTexte) / 2));
• On a besoin d’un Graphics pour obtenir la taille d’un p ptexte (ici celui du Component) car la taille d’un caractère dépend de l’épaisseur du trait pour le tracerRichard Grin Interface graphique 257
![Page 258: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/258.jpg)
Taille utilisable d'un GraphicsTaille utilisable d un Graphics• Il arrive qu'une méthode reçoive en paramètre
une instance de Graphics qui provient d'un composant graphique extérieur à la classe de la p g p qméthodeO t é é l t l ffi hé tt• On peut récupérer le rectangle affiché par cette instance par la méthode getClipBounds() :
( )public void dessine(Graphics g) {Rectangle r = g.getClipBounds();g drawLine(0 0 r width r height);g.drawLine(0, 0, r.width, r.height);
}Trace une diagonale
Richard Grin Interface graphique 258
![Page 259: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/259.jpg)
Images
Richard Grin Interface graphique 259
![Page 260: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/260.jpg)
ImagesImages• Les images sont des objets complexesLes images sont des objets complexes
(pixels, modèle de représentation des pixels, en particulier pour les couleurs)particulier pour les couleurs)
• De base, Java sait travailler avec les images l iGIF, JPEG ou PNG, et les GIF animés
Richard Grin Interface graphique 260
![Page 261: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/261.jpg)
Classes pour les imagesClasses pour les images
• Elles sont représentées en Java par 3 classes• Elles sont représentées en Java par 3 classes– java.awt.Image : une image de base– java.awt.image.BufferedImage :
permet de manipuler les pixels de l'imagepermet de manipuler les pixels de l image– javax.swing.ImageIcon : correspond à
une image de taille fixe utilisée pour décorer un composantp
Richard Grin Interface graphique 261
![Page 262: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/262.jpg)
Relations entre les classesRelations entre les classesObject
<<interface>> <<interface>><<interface>>Icon
<<interface>>Serializable
Image
BufferedImage ImageIconBufferedImage ImageIcon
La méthode getImage() de la classe ImageIcon fournit uneinstance de ImageUn des (nombreux) constructeurs de ImageIcon prend une Image en paramètre
Richard Grin Interface graphique 262
Image en paramètre
![Page 263: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/263.jpg)
• On va commencer par des généralités sur les images et on étudiera ensuite les 3 classes d’images plus en détailsg p
Richard Grin Interface graphique 263
![Page 264: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/264.jpg)
Traitement standard avec une imageTraitement standard avec une image
1. Récupérer l’image désignée par un nom de fichier local ou par un URL local ou distantp
2. Afficher l’image dans un composant (on ne t ffi h di t t i dpeut afficher directement une image dans
un container)
Richard Grin Interface graphique 264
![Page 265: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/265.jpg)
Récupérer une image
• Le chargement d’une image peut être long• Le plus souvent ce chargement doit être
effectué par un thread en parallèle poureffectué par un thread en parallèle pour libérer le thread de distribution des événements et ne pas figer l’interfaceévénements et ne pas figer l’interface graphique
Richard Grin Interface graphique 265
![Page 266: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/266.jpg)
Affi h d’ iAffichage d’une image
• Lorsque le chargement s’effectue en parallèle l’image s’affiche petit à petitparallèle, l image s affiche petit à petit, comme sur un navigateur Web
• Si ce comportement ne convient pas, on peut utiliser un MediaTraker pour attendre p ple chargement complet de l’image par le thread ; on n’affiche l’image qu’ensuitethread ; on n affiche l image qu ensuite
Richard Grin Interface graphique 266
![Page 267: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/267.jpg)
Afficher une imageAfficher une image• Les classes d'images ne dérivent pas de la• Les classes d images ne dérivent pas de la
classe JComponent ; si on veut afficher une i il f t l'i l d timage, il faut l'inclure dans un composant
• En Swing, on peut l’inclureg, p– dans un JLabel (le plus simple)
i i d– mais aussi dans un JPanel, un JComponent ou un JButton
• Avec AWT, on inclut les images dans un Canvas
Richard Grin Interface graphique 267
![Page 268: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/268.jpg)
Désigner une imageDésigner une image• Désigner une image locale par l’emplacement• Désigner une image locale par l emplacement
de son fichier dans l’arborescence ne marche i l’i d fi hi jpas si l’image est dans un fichier jar
• C’est une des erreurs les plus fréquemment p qrencontrées dans les projets d’étudiantsO é é l i ’ ll i t• On pourra récupérer les images qu’elles soient dans un fichier jar ou non, si on désigne l’image comme une ressource en utilisant la méthode getResource de la classe Class
Richard Grin Interface graphique 268
![Page 269: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/269.jpg)
Exemple : obtenir une ImageIconExemple : obtenir une ImageIconcomme une ressource
• On délègue au chargeur de classes la recherche du fi hi i ti t l’ifichier qui contient l’image :URL url = getClass().getResource(nomFichier);ImageIcon icone = new ImageIcon(url);ImageIcon icone = new ImageIcon(url);
• Le chargeur de classe recherche l’image selon son algorithme de recherche, typiquement, à partir du classpath si nomFichier est un nom absolu, ou à partir de l’emplacement du fichier classe (.class) si le nom est relatif
Richard Grin Interface graphique 269
le nom est relatif
![Page 270: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/270.jpg)
Quelle classe choisir ?Quelle classe choisir ?
• Si on veut seulement afficher une image, sans la retoucher, le plus simple est d'utiliser , p pImageIcon
• Si l'on veut effectuer le chargement d'une• Si l on veut effectuer le chargement d une image en tâche de fond, ou pouvoir modifier la t ill d l'i il f d tili Itaille de l'image, il faudra utiliser Image
• Si on veut faire des traitements sur une image, g ,il est nécessaire d'utiliser BufferedImage
Richard Grin Interface graphique 270
![Page 271: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/271.jpg)
ImageIcon
Richard Grin Interface graphique 271
![Page 272: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/272.jpg)
Obt i I IObtenir une ImageIcon
• Il existe des constructeurs de ImageIcon pour créer ne instance à partir de :créer une instance à partir de :– un nom de fichier absolu ou relatif ; le
séparateur est « / » quel que soit le système un URL (adresse Internet ; URL)– un URL (adresse Internet ; URL)
– une image (Image) – un tableau de byte (byte[])
Richard Grin Interface graphique 272
![Page 273: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/273.jpg)
Afficher une ImageIconAfficher une ImageIcondans un JLabel
URL url = getClass().getResource("/img/image.gif");
Icon icone = new ImageIcon(url);JLabel label = new JLabel(icone);JLabel label2 =
new JLabel("Texte label", icone);
Richard Grin Interface graphique 273
![Page 274: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/274.jpg)
Obtenir une ImageIcongdepuis une applet
String nomFichier = "images/image.gif";try {
URL url = new URL(getCodeBase(),nomFichier);
ImageIcon imageIcon = new ImageIcon(url);}catch (MalformedURLException e) { . . . }p
Richard Grin Interface graphique 274
![Page 275: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/275.jpg)
Image
Richard Grin Interface graphique 275
![Page 276: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/276.jpg)
Chargement en tâche de fondg• Les méthodes getImage des classes Applet ou Toolkit permettent de lier une instance de Image à une image ; elles ne chargent pas l’image en mémoire
• Ces méthodes retournent immédiatement ;Ces méthodes retournent immédiatement ; elles ne renvoient pas d’erreur si l’image n’existe pasn existe pas
• L’image sera ensuite chargée petit à petit par un thread de chargement lorsqu’onpar un thread de chargement lorsqu on demandera son affichage
Richard Grin Interface graphique 276
![Page 277: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/277.jpg)
Obtenir une Imagedans une application
• Image image = Toolkit.getDefaultToolkit()g
.getImage("uneImage.gif");
• getImage prend en paramètre un nom degetImage prend en paramètre un nom de fichier ou un URLR l h i l’i t• Rappel : ne marche pas si l’image est dans un jar
Richard Grin Interface graphique 277
![Page 278: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/278.jpg)
Obtenir une image gcomme une ressource
• Même principe que pour une ImageIcon : on ili l h d lutilise le chargeur de classe
(getClass().getResource(…))• On utilise ensuite java awt Toolkit getImage(URL url)java.awt.Toolkit.getImage(URL url) pour récupérer l’image avec l’URL fourni par le h d lchargeur de classe
Richard Grin Interface graphique 278
![Page 279: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/279.jpg)
Obtenir une Imagegdepuis une applet
• Une applet peut créer une image par les méthodes Image getImage(URL url) ou g g gImage getImage(URL base, String nom) :image = getImage(getCodeBase(), g g g (g (),
"image1.gif")
• Si aucune politique de sécurité spécial n’a étéou getDocumentBase()
• Si aucune politique de sécurité spécial n a été installée, seules les images qui proviennent du même serveur Web que l’applet peuvent être manipulées
Richard Grin Interface graphique 279
p
![Page 280: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/280.jpg)
Afficher une Image dans un gJComponent ou un JPanel
• Il faut redéfinir la méthode paintComponent dans une sous classe de JC t ou de JP lune sous-classe de JComponent ou de JPanelpublic void paintComponent(Graphics g) {
. . .g.drawImage(image, 75, 100, this);. . .
}}
• Ce paramètre sert à indiquer un ImageObserver qui est informé du chargement de l’image ; la classe Component implémente g g ; p pImageObserver en appelant la méthode paint() à chaque fois qu’une nouvelle partie de l’image est chargée
Richard Grin Interface graphique 280
![Page 281: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/281.jpg)
Ch l di i d’ iChanger les dimensions d’une image
• La méthode drawImage permet de modifier les dimensions de l’image affichée :boolean
drawImage(Image img, int x, int y, int largeur int hauteurint largeur, int hauteur,ImageObserver observateur)
• On peut aussi changer la couleur de fond• On peut aussi changer la couleur de fond
Richard Grin Interface graphique 281
![Page 282: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/282.jpg)
Affichage par drawImageAffichage par drawImage
• La méthode drawImage() retourne immédiatement, même si l’image n’est pasimmédiatement, même si l image n est pas entièrement disponibleL h d l’i ffi h• Le chargement de l’image et son affichage est effectué par un thread, en parallèle du traitement principal du programme
Richard Grin Interface graphique 282
![Page 283: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/283.jpg)
Savoir si une image est chargéeg g• Pour savoir si une image est déjà chargée, le plus simple
d’ ili l é h d d l lest d’utiliser la méthode checkID de la classe MediaTracker ; on passe le composant qui va utiliser l’image au mediaTracker (ou un autre composant) :MediaTracker md = new MediaTracker(composant);md.addImage(image, 0);g ( g , );if (md.checkID(0)) {
System.out.println("Chargement terminé");if (md isErrorID(0))if (md.isErrorID(0))
System.err.println("Erreur pendant chargement");}elseelse
System.out.println("Pas encore chargée");
Richard Grin Interface graphique 283
![Page 284: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/284.jpg)
java.awt.MediaTrackerjava.awt.MediaTracker
• On peut aussi utiliser un MediaTracker pourOn peut aussi utiliser un MediaTracker pour attendre le chargement complet d’une image
• Un mediaTracker peut surveiller le chargement de• Un mediaTracker peut surveiller le chargement de plusieurs images (chacune a un numéro) : // L’image sera tracée dans le composant comp// L image sera tracée dans le composant compMediaTracker md = new MediaTracker(comp);Image image = Toolkit.getDefaultToolkit()
.getImage(image);md.addImage(image, 0);try {try {md.waitForID(0); // ou waitForAll()
}t h(I t t dE ti ) {}
Richard Grin Interface graphique 284
catch(InterruptedException e) {}
![Page 285: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/285.jpg)
Chargement d’une IMageIconChargement d une IMageIcon
• Une ImageIcon est automatiquement chargée• Une ImageIcon est automatiquement chargée par un mediatracker quand l’image est créée à partir d’un nom de fichier ou d’une URL
• La méthode getImageLoadStatus() permetLa méthode getImageLoadStatus() permet de savoir si l’image a pu être chargée
• setImageObserver(ImageObserver)• setImageObserver(ImageObserver)
permet d’observer le chargement de l’image (peut être utile pour les images gif animées)être utile pour les images gif animées)
Richard Grin Interface graphique 285
![Page 286: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/286.jpg)
Taille d’une imageTaille d une image
• Les méthodes• Les méthodes getHeight(ImageObserver observer)tWidth(I Ob b )getWidth(ImageObserver observer)
de la classe Image renvoient les dimensions d l’i ( 1 i l’i f i ’de l’image (-1 si l’information n’est pas encore disponible)
• Les méthodes getIconWidth() et getIconHeight() peuvent être utilisées get co e g t() peuve ê e u séespour les icônes
Richard Grin Interface graphique 286
![Page 287: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/287.jpg)
Mettre à jour une image
• Pour des raisons de performances les images sont gardées dans des caches par le système d’affichagey g
• Si l’image est modifiée entre 2 affichages, il peut être nécessaire d’appeler la méthodepeut être nécessaire d’appeler la méthode flush :i fl h()image.flush();
Richard Grin Interface graphique 287
![Page 288: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/288.jpg)
BufferedImage
Richard Grin Interface graphique 288
![Page 289: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/289.jpg)
• Classe fille de Image, elle permet d’effectuer des traitements complexes sur les imagesg
• Elle ne sera pas traitée en détails dans ce courscours
Richard Grin Interface graphique 289
![Page 290: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/290.jpg)
Créer et dessiner une BufferedImage
// Créer une BufferedImage (avec un composant)bufferedImage =
(BufferedImage)composant.createImage(w, h);// Créer une BufferedImage (sans composant)b ff dIbufferedImage =
new BufferedImage(w, h,BufferedImage.TYPE INT RGB);BufferedImage.TYPE_INT_RGB);
// Dessiner sur l'imageGraphics2D g2d = bufferedImage.createGraphics();dessiner(g2d); // fait des dessins sur g2dg2d.dispose();
Richard Grin Interface graphique 290
![Page 291: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/291.jpg)
Passer de Image à BufferedImage
Image img = …;B ff dI bi B ff dI (BufferedImage bi = new BufferedImage(
img.getWidth(null), i i h ( ll)img.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics g = bi.getGraphics();g.drawImage(img, 0, 0, null);
Richard Grin Interface graphique 291
![Page 292: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/292.jpg)
javax.imageio
Richard Grin Interface graphique 292
![Page 293: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/293.jpg)
Paquetage javax imageioPaquetage javax.imageio
C t t d h t d• Ce paquetage permet de charger et sauvegarder facilement n’importe quel type d’image
• Il utilise la notion de plugin pour supporter les différents types d’imagedifférents types d image
• Dans l’API Java de base depuis le JDK 1.4
Richard Grin Interface graphique 293
![Page 294: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/294.jpg)
Classe ImageIOClasse ImageIO
Cl d• Classe du paquetage javax.imageio• Méthodes static read pour lire depuis un é odes stat c ead pou e depu s u
fichier local (File), un flot ou un URL (lecture directe sans utilisation d’un thread endirecte sans utilisation d un thread en parallèle)
• Méthodes write pour écrire un BufferedImage dans un fichier ou un flot, en g ,choisissant le codage d’écriture
Richard Grin Interface graphique 294
![Page 295: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/295.jpg)
Codages supportés par ImageIOCodages supportés par ImageIO• En lecture les formats gif, png et jpeg sont g p g jp g
supportés par l’API• En écriture seuls les formats png et jpeg• En écriture, seuls les formats png et jpeg
sont supportés• On peut trouver des paquetages sur le Web
pour ajouter d’autres formatsp j• Obtenir les formats supportés en lecture :String[] formatNames =String[] formatNames = ImageIO.getReaderFormatNames();
Richard Grin Interface graphique 295
![Page 296: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/296.jpg)
Exemples pour ImageIOURL url =
getClass() getResource("/img/image gif");getClass().getResource( /img/image.gif );BufferedImage bi = ImageIO.read(url);. . .String nomFichier = "http://.../truc.gif";bi = ImageIO.read(new URL(nomFichier));g ( ( ));
Richard Grin Interface graphique 296
![Page 297: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/297.jpg)
Interface Action
Richard Grin Interface graphique 297
![Page 298: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/298.jpg)
Représenter une actionep ése e u e c o• Il arrive souvent qu’une même action (parIl arrive souvent qu une même action (par
exemple, quitter l’application, imprimer, ouvrir un fichier obtenir de l’aide) puisse être déclenchéefichier, obtenir de l aide) puisse être déclenchée par différents moyens :
h i d’– choix d’un menu– clic sur un bouton de la souris– frappe d'une combinaison de touches au clavier
(Ctrl-A)( )– etc.
Richard Grin Interface graphique 298
![Page 299: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/299.jpg)
Informations centralisées• L’interface Action permet de centraliser
– un texte (qui s’affiche sur les boutons ou les menus)– une icône– un traitement à exécuter
le fait que ce traitement est permis ou pas– le fait que ce traitement est permis ou pas– un texte « actionCommand »– un mnémonique– un raccourci clavier– un texte qui décrit l’action (version longue ou courte
utilisée par les bulles d’aide)Richard Grin Interface graphique 299
utilisée par les bulles d aide)
![Page 300: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/300.jpg)
Utilisation des actions• Cette action peut être utilisée par plusieurs p p p
composants de types éventuellement différents• Certains attributs de ces composants sont alors• Certains attributs de ces composants sont alors
fixés par l’action– le texte des boutons ou des menus– l'action leur est ajoutée comme ActionListenerj
– …
Richard Grin Interface graphique 300
![Page 301: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/301.jpg)
Classe et interface pour les actionsC sse e e ce pou es c o s• L’interface javax.swing.Action (hérite deL interface javax.swing.Action (hérite de ActionListener) permet de représenter une telle actionaction
• On héritera le plus souvent de la classe abstraite AbstractAction
• Des constructeurs de cette classe prennent enDes constructeurs de cette classe prennent en paramètres (optionnels) un texte et une icône
Richard Grin Interface graphique 301
![Page 302: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/302.jpg)
Interface Action• L’interface Action a les méthodes suivantes
(hé i é d )– actionPerformed (héritée de ActionListener) – setEnabled et isEnabled indiquent si l’action peut
être lancée ou non– putValue et getValue permettent d’ajouter des p g p j
attributs (paire « nom-valeur ») à l’action ; 2 attributs prédéfinis : Action.NAME et Action.SMALL ICONp _(utilisés si l’action est associée à un menu ou à une barre d'outils)
– {add|remove}PropertyChangeListener pour, par { | } p y g p , pexemple, notifier un menu associé à une action que l’action est invalidée
Richard Grin Interface graphique 302
![Page 303: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/303.jpg)
Classes qui peuvent utiliser une actionq p• Ce sont des sous-classes de AbstractButton ;
ll i li i delles ont en particulier un constructeur qui prend en paramètre une action :– Boutons (JButton)– Boutons radio (JRadioButton) y compris dans unBoutons radio (JRadioButton), y compris dans un
menu (JRadioButtonMenuItem)Boîtes à cocher (JCh kB ) y compris dans un– Boîtes à cocher (JCheckBox), y compris dans un menu (JCheckBoxMenuItem)
( )– Menu (JMenu)– Choix de menu (JMenuItem)
Richard Grin Interface graphique 303
![Page 304: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/304.jpg)
Utilisation des actionsU s o des c o sImageIcon image = new ImageIcon("gauche.gif");
ti P d tactionPrecedent = new AbstractAction("Question précédente", image) {
public void actionPerformed(ActionEvent e) {public void actionPerformed(ActionEvent e) {. . .
}};
. . .JB tt bP d t JB tt ( ti P d t)
Définition de l’action
JButton bPrecedent = new JButton(actionPrecedent);panel.add(bPrecedent); bPrecedent.setText(""); // bouton "image" avec tooltip
Utilisation de l’actionbPrecedent.setText( ); // bouton image avec tooltip
Richard Grin Interface graphique 304
![Page 305: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/305.jpg)
Utilisation des actionsU s o des c o s• On peut associer une action à un bouton (en fait
à un AbstractButton, c’est-à-dire JButton, JMenuItem, JToggleButton) par la méthode setAction(Action)
• Cette méthode fait tout ce qu’on peut en q pattendre ; elle ajoute en particulier l’action comme écouteur du bouton, met le nom ,(propriété NAME), l’icône (SMALL_ICON), le texte de la bulle d’aide du bouton (SHORT_DESCRIPTION)
• La méthode getAction() récupère l’actionRichard Grin Interface graphique 305
La méthode getAction() récupère l action
![Page 306: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/306.jpg)
Interfaces graphiques dynamiques
Richard Grin Interface graphique 306
![Page 307: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/307.jpg)
• Il s’agit d’interfaces graphiques qui sont difié è i ffi hmodifiées après un premier affichage
• Ces modifications sont le plus souvent pengendrées par les actions de l’utilisateur
• Elles peuvent aussi être provoquées par leElles peuvent aussi être provoquées par le chargement d’un certain type de fichier ou par le passage à une nouvelle étape dupar le passage à une nouvelle étape du traitement
Richard Grin Interface graphique 307
![Page 308: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/308.jpg)
Moyens à utiliserMoyens à utiliser
M difi l’i t f hi à l’ id d• Modifier l’interface graphique à l’aide des méthodes add, remove ou removeAll de la l C t iclasse Container
• Ensuite, faire afficher la nouvelle interface par repaint
• Le plus souvent on devra envoyer desLe plus souvent on devra envoyer des revalidate aux composants qui ont changé d’aspect et des validate sur les containers àd aspect et des validate sur les containers à qui on a ajouté ou retiré des composants
Richard Grin Interface graphique 308
![Page 309: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/309.jpg)
Démo
• On récupère une démo (avec le code source) des tous les composants quand on récupère le JDK ; elle est à l’adresse ;jdk1.6.0\demo\jfc\SwingSet2\SwingSet2.jarj
Richard Grin Interface graphique 309
![Page 310: Interfaces ggpqraphiques Introduction - unice.frdeptinfo.unice.fr/~grin/messupports/java/GeneralitesGUI1.pdf · 2011-04-10 · Programmation conduite par les événements • Uitf](https://reader033.fdocuments.us/reader033/viewer/2022042008/5e70c3cf56d1dc5c7258b651/html5/thumbnails/310.jpg)
Java Look and Feel Repository
• Oracle fournit un ensemble d’icônes qu’on peut utiliser dans ses propres interfaces graphiques à l’adresse suivante :g p qhttp://java.sun.com/developer/techDocs/hi/repository/
• De nombreuses autres icônes sont disponibles sur le Webdisponibles sur le Web
Richard Grin Interface graphique 310