Java AWT et Swing Composants graphiques de Java

  • Slides: 55
Download presentation
Java AWT et Swing Composants graphiques de Java o Aperçu général o Images o

Java AWT et Swing Composants graphiques de Java o Aperçu général o Images o “Bonjour, monde” o Un exemple détaillé o Classes de composants o Swing o Gestion des événements o le même exemple, en Swing o Modèle - vue - contrôleur o Pluggable Look and feel o Applettes o Actions Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 1

Sources des exemples. . . n La plupart des exemples de programmes sont inspirés

Sources des exemples. . . n La plupart des exemples de programmes sont inspirés des exemples figurant dans les livres suivants: l l n Java AWT et Swing R. Eckstein, M. Loy, D. Wood, “Java Swing”, O’Reilly 1998. C. Horstmann, G. Cornell, “Au cœur de Java 2”, Campus Press, vol. 1 1999, vol. 2 2000. M. Robinson, P. Vorobiev, “Swing”, Manning Publ. Co. 2000. J. Knudsen, “Java 2 D Graphics”, O’Reilly 1999. Pour des compléments Java, voir: l G. Roussel, E. Duris, “Java et Internet”, Vuibert 2000. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 2

Aperçu général n Les programmes à interfaces graphiques font usage des classes awt(abstract windowing

Aperçu général n Les programmes à interfaces graphiques font usage des classes awt(abstract windowing toolkit) et/ou swing. n Ils sont dirigés par évènements. n Classe de base des awt : la classe abstraite Component. n Classe de base des composants swing : JComponent. n On distingue, par service l l l n Java AWT et Swing les classes conteneur les classes d'interaction les menus et dialogues Swing offre une palette bien plus large. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 3

“Bonjour, monde” Java AWT et Swing import javax. swing. *; class bjm { public

“Bonjour, monde” Java AWT et Swing import javax. swing. *; class bjm { public static void main(String[] args) { JOption. Pane. show. Message. Dialog(null, "Bonjour, monde"); System. exit(0); } } n Le programme est dirigé par événements l l un thread dédié: Event. Dispatch. Thread gère la distribution des événements le programme ne termine pas implicitement, d’où le System. exit(0) Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 4

Java AWT et Swing Les conteneurs n n n Container classe abstraite, responsable du

Java AWT et Swing Les conteneurs n n n Container classe abstraite, responsable du layout Window pour interaction avec le système Frame fenêtre principale d'application n Panel contient des composants n Applet n Scroll. Pane enrobe un conteneur d'ascenseurs o un programme étend Frame o une applette étend Applet Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Component Container Window Frame Dialog File. Dialog Panel Applet Scroll. Pane 5

Exemple Java AWT et Swing import java. awt. *; import java. awt. event. *;

Exemple Java AWT et Swing import java. awt. *; import java. awt. event. *; import java. applet. Applet; public class Action. Exemple extends Applet implements Action. Listener { Button b; public void init() { b = new Button("En avant !"); b. add. Action. Listener(this); add(b); } public void action. Performed(Action. Event e) { if (b. get. Label(). equals("En avant !")) b. set. Label("Ouille !"); else b. set. Label("En avant !"); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 6

Classes d'interaction Java AWT et Swing Canvas pour le dessin Choices est une sorte

Classes d'interaction Java AWT et Swing Canvas pour le dessin Choices est une sorte de combobox Checkbox. Group composant logique Menu. Bar Label Text. Field Choice List Checkbox Button Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 7

Menus Java AWT et Swing Menu. Component est abstraite Menu est une sous-classe de

Menus Java AWT et Swing Menu. Component est abstraite Menu est une sous-classe de Menu. Item par le design pattern des conteneurs Les raccourcis sont adaptés à la plate-forme Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 8

Graphique Java AWT et Swing n Graphics fournit à la fois le canal d'affichage

Graphique Java AWT et Swing n Graphics fournit à la fois le canal d'affichage et les outils de dessin n Image pour les images n Point, Polygon, Rectangle n Font, Font. Metrics pour les polices n Color n Java 2 D a beaucoup de possibilités Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 9

Layouts : gestionnaires de géométrie n Gère la disposition des composantes filles dans un

Layouts : gestionnaires de géométrie n Gère la disposition des composantes filles dans un conteneur Java AWT et Swing Object n Les gestionnaires par défaut sont l l Border. Layout pour u Window u Frame u Dialog Flow. Layout pour u Panel u Applet Border. Layout Card. Layout Grid. Bag. Layout Box. Layout Grid. Layout. Manager Flow. Layout Grid. Bag. Constraints n Box. Layout est nouveau et utile n Layout. Manager et Layout. Manager 2 sont des interfaces Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Layout. Manager 2 10

Java AWT et Swing Exemples n Flow. Layout une deux quatre n trois cinq

Java AWT et Swing Exemples n Flow. Layout une deux quatre n trois cinq Border. Layout North West Center East South Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 11

Java AWT et Swing Exemples n n Grid. Layout : chaque cellule de même

Java AWT et Swing Exemples n n Grid. Layout : chaque cellule de même taille une deux trois quatre cinq six n : grille, lignes et colonnes de taille variable Gridbag. Layout Box. Layout (horizontal) : cellules de même hauteur, de largeur variable une deux trois quatre Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 12

Gestion des évènements Java AWT et Swing n Un composant enregistre des auditeurs d’évènements

Gestion des évènements Java AWT et Swing n Un composant enregistre des auditeurs d’évènements (Listeners). n Lorsqu’un événement se produit dans un composant, il est envoyés aux auditeurs enregistrés. n Chaque auditeur définit les actions à entreprendre, dans des méthodes aux noms prédéfinis. n Exemple: n Un Button enregistre des Action. Listener n Lors d’un clic, un Action. Event est envoyé aux Action. Listener enregistrés. n Ceci provoque l’exécution de la méthode action. Performed de chaque Action. Listener Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 13

Exemple n Java AWT et Swing Une classe de boutons class Mon. Bouton extends

Exemple n Java AWT et Swing Une classe de boutons class Mon. Bouton extends Button { int incr; Mon. Bouton(String titre, int incr) { super(titre); this. incr = incr; } } n int get. Incr() { return incr; } Une classe d’étiquettes auditrices class Listener. Label extends Label implements Action. Listener { Listener. Label() { super("0", Label. CENTER); } } public void action. Performed(Action. Event e) { Mon. Bouton b = (Mon. Bouton)e. get. Source(); int c = Integer. parse. Int(get. Text()); c += b. get. Incr(); set. Text(Integer. to. String(c)); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 14

Exemple (fin) n Java AWT et Swing Le cadre class Plusou. Moins extends Frame

Exemple (fin) n Java AWT et Swing Le cadre class Plusou. Moins extends Frame { public Plusou. Moins() { super("Plus ou moins"); Button oui = new Mon. Bouton("Plus !", +1); Button non = new Mon. Bouton("Moins !", -1); Label diff = new Listener. Label(); add(oui, "North"); add(diff, "Center"); add(non, "South"); oui. add. Action. Listener((Action. Listener) diff); non. add. Action. Listener((Action. Listener) diff); }; } n public static void main (String[] argv) { Frame r = new Plusou. Moins(); r. pack(); r. set. Visible(true); r. add. Window. Listener(new Window. Closer()); } Et pour fermer class Window. Closer extends Window. Adapter { public void window. Closing(Window. Event e) { System. exit(0); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 15

Qui est à la manœvre ? n Le modèle MVC (model -view -controller) l

Qui est à la manœvre ? n Le modèle MVC (model -view -controller) l l l n Java AWT et Swing le modèle gère les données la vue affiche les données le contrôleur gère la communication et les mises-à-jour Origine : Smalltalk class Plusou. Moins. MVC { Model model; View view; Controller control; public Plusou. Moins. MVC() { model = new Model(); control = new Controller(); view = new View(control); } } control. set. Model(model); control. set. View(view); view. set. Visible(true); view. add. Window. Listener(new Window. Closer()); public static void main (String[] argv) { Plusou. Moins. MVC r = new Plusou. Moins. MVC(); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 16

Echange de messages Vue a controlleur : bouton Up ! Controlleur a modele :

Echange de messages Vue a controlleur : bouton Up ! Controlleur a modele : changer compteur de Controlleur a modele : que vaut compteur ? Controlleur a vue : afficher compteur dans Vue a controlleur : bouton Down ! Controlleur a modele : changer compteur de Controlleur a modele : que vaut compteur ? Controlleur a vue : afficher compteur dans. . . Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Java AWT et Swing 1 reponse = 1 etiquette 1 reponse = 2 etiquette -1 reponse = 1 etiquette 17

Java AWT et Swing Modèle n Le modèle contient la donnée n La mise-à-jour

Java AWT et Swing Modèle n Le modèle contient la donnée n La mise-à-jour par update() n Le renseignement par get. Value() class Model { int compteur; Model() { compteur = 0; } void update(int incr) { compteur += incr; } int get. Value() { return compteur; } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 18

Java AWT et Swing Vue n La vue affiche les composants et les données

Java AWT et Swing Vue n La vue affiche les composants et les données n La mise-à-jour (du texte de l’étiquette est faite par update() n La notification de modifications au contrôleur. C’est le contrôleur qui écoute ! n Les renseignements sont pris par get. Value(). La vue se débrouille pour les obtenir. class View extends Frame { Button oui = new Button("Up !"); Button non = new Button("Down !"); Label diff = new Label("0", Label. CENTER); public View(Controller c) { super("Plus ou moins"); add(oui, Border. Layout. NORTH); add(non, Border. Layout. SOUTH); add(diff, Border. Layout. CENTER); oui. add. Action. Listener(c); non. add. Action. Listener(c); pack(); } void update(int compte) { diff. set. Text(Integer. to. String(compte)); } int get. Value(Action. Event e) { Button b = (Button)e. get. Source(); return (b == oui) ? 1 : -1; } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 19

Contrôleur n Réveillé par les actions produites dans la vue n Récupère des information

Contrôleur n Réveillé par les actions produites dans la vue n Récupère des information dans la vue n Met à jour dans le modèle n Récupère la nouvelle valeur dans le modèle n La transmet pour affichage à la vue Java AWT et Swing class Controller implements Action. Listener { private Model m; private View v; public void action. Performed(Action. Event e) { m. update(v. get. Value(e)); v. update(m. get. Value()); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 20

Applettes : généralités n Une applette est une Panel Java AWT et Swing spécialisée.

Applettes : généralités n Une applette est une Panel Java AWT et Swing spécialisée. Elle est incorporé dans un conteneur pour exécution. n Une applette n'est donc pas une application autonome. n Un "applet context" est un objet contenant des informations sur l’environnement dans lequel s’exécute l’applette. n Une applette est active ou inactive: l l l n au chargement, inactive au premier affichage, devient active selon le contexte, devient inactive u si elle sort de la partie visible de la page u si une autre page est activée Méthodes de gestion l l init() création, inactive start() mise en route, activation stop() arrêt, désactivation destroy()quand on quitte le programme. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 21

Balise d'applette n Dans une page HTML, balises <applet> et <param>. n Attributs de

Balise d'applette n Dans une page HTML, balises <applet> et <param>. n Attributs de la balise <applet>: name : donne un nom à une applette; permet de distinguer deux occurrences de la même applette; codebase : adresse URL où se trouve le binaire, par défaut ". " code : la classe de l'applette; le nom local, sans répertoire. n Attributs de la balise <param>: name : nom d'un paramètre value : la valeur associée au paramètre. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Java AWT et Swing o Balisage minimal : code, largeur, hauteur <applet code=Bonjour width=200 height=200> </applet> <APPLET [CODEBASE = url du répertoire] CODE = fichier de l'applette WIDTH = largeur du conteneur HEIGTH = sa hauteur [ALT = texte de remplacement] [ARCHIVE = fichiers archives] [NAME = nom de l'instance de l'applette ] [ALIGN = top, middle, left (dans la page)] [VSPACE = marges haute et basse] [HSPACE = marges gauche et droite] > [<PARAM NAME = nom VALUE = sa valeur>] [<. . . >] ["Remplaçant-html" si balise APPLET inconnue] </APPLET> 22

Méthodes d'applettes n URL get. Code. Base() de l'applette. Java AWT et Swing :

Méthodes d'applettes n URL get. Code. Base() de l'applette. Java AWT et Swing : le répertoire contenant le fichier suffixé class n URL get. Document. Base() : le répertoire contenant le fichier html contenant la balise <applet>. n String get. Parameter(String) : retourne la valeur associée au paramètre: Image i = get. Image(get. Document. Base(), get. Parameter("image")); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 23

Obtenir une image n La classe abstraite java. awt. Image étend Object. n Les

Obtenir une image n La classe abstraite java. awt. Image étend Object. n Les images sont obtenus, dans les applettes, par la méthode java. applet. Applet. get. Image() n Un producteur d'images (Image. Producer) les fournit, n Un observateur d'images (Image. Observer) les récupère. n L'interface Image. Observer est implémentée par Component, et tout composant graphique peut donc "observer" des images. n Le chargement d’images est asynchrone (sauf en Swing). Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Java AWT et Swing 24

Afficher une image n Java AWT et Swing C'est un Graphics qui affiche l'image,

Afficher une image n Java AWT et Swing C'est un Graphics qui affiche l'image, par: g. draw. Image(image, . . . , observateur) n L'observateur est le composant où s'affiche l'image. n Il y a 6 variantes de draw. Image, la plus simple indique l'origine de la zone d'affichage, la plus sophistiquée permet d'afficher une partie de l'image dans un rectangle spécifiée. public void paint(Graphics g) { g. draw. Image(im, 0, 0, this); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 25

Un exemple (en applette) n Package net pour les URL. n Les dimensions de

Un exemple (en applette) n Package net pour les URL. n Les dimensions de l'applette sont indiquées dans le fichier html n L'image est prise où elle se trouve. import Java AWT et Swing java. net. URL; java. applet. Applet; java. awt. Graphics; java. awt. Image; public class Image. Test. Applet. Simple extends Applet { private Image im; public void init() { URL cb = get. Code. Base(); im = get. Image(cb, "saint. gif"); } public void paint(Graphics g) { g. draw. Image(im, 0, 0, this); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 26

Le dessin Java AWT et Swing n En Java 1. 1, les outils de

Le dessin Java AWT et Swing n En Java 1. 1, les outils de dessin sont assez rudimentaires. l l l n des méthodes draw*() et fill*() pour lignes, rectangles, ovales, polygone; choix de deux modes de dessin : direct ou xor; une zone de découpe (clipping) rectangulaire. Java 2 propose des possibilités très sophistiquées. l l l En particulier, le “double buffering” est automatique par défaut dans les classes Swing. Une hiérarchie de classes Shape Des possibilités similaires à Post. Script (path’s) Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 27

Contexte graphique n Java AWT et Swing L'outil de dessin est le contexte graphique,

Contexte graphique n Java AWT et Swing L'outil de dessin est le contexte graphique, objet de la classe Graphics. Il encapsule l'information nécessaire, sous forme d'état graphique. Celui-ci comporte l l l la zone de dessin (le composant), pour les méthodes draw*() et fill*() une éventuelle translation d'origine le rectangle de découpe (clipping) la couleur courante la fonte courante l'opération de dessin (simple ou xor) la couleur du xor, s'il y a lieu. n Chaque composant peut accéder implicitement et explicitement à un contexte graphique. n Java 2 D utilise la classe Graphics 2 D qui dérive de Graphics. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 28

Java AWT et Swing Exemple public void paint(Graphics g) { int largeur = get.

Java AWT et Swing Exemple public void paint(Graphics g) { int largeur = get. Size(). width; int hauteur = get. Size(). height; int dl = largeur/2, dh = hauteur/2; int [] polx = { 0, dl, largeur, dl}; int [] poly = {dh, 0, dh, hauteur}; Polygon pol = new Polygon(polx, poly, 4); g. set. Color(Color. black); g. fill. Rect(0, 0, largeur, hauteur); g. set. Color( Color. yellow); g. fill. Polygon(pol); g. set. Color( Color. red); g. fill. Rect(dl/2, dh/2, dl, dh); g. set. Color( Color. green); g. fill. Oval(dl/2, dh/2, dl, dh); g. set. Color( Color. blue); g. fill. Arc(dl/2, dh/2, dl, dh, th, del); } public class Losange extends Applet{ int th = 45, del =45; public void init(){ add. Mouse. Listener(new Mouse. Adapter() { public void mouse. Pressed(Mouse. Event e){ th = (th +10)%360; repaint(); } }); } public void paint(Graphics g) {. . . } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 29

Un exemple détaillé n L'exemple comporte l l n un menu des panneaux (Panel)

Un exemple détaillé n L'exemple comporte l l n un menu des panneaux (Panel) Les panneaux contiennent l l l n Java AWT et Swing des étiquettes (Label) un champ de texte (Text. Field) une liste (List) des boutons à cocher (Check. Box) des boutons radio des boutons ordinaires Des auditeurs (Action. Listener) pour réagir Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 30

Structure globale n Le constructeur Tout() met en place les composants n Les variables

Structure globale n Le constructeur Tout() met en place les composants n Les variables servent dans l'audition n Tout est son propre auditeur pour le bouton ok n Le Fermeur permet de fermer par le système n Les actions sur le menu sont auditionnées séparément Java AWT et Swing class Tout extends Frame implements Action. Listener { Text. Field tf; Choice ch; List ls; Checkbox cb. Solaris, cb. Linux, cb. Mac. Os; Checkbox. Group rb. Group; Tout() { // Text. Field // Choice // List // Checkbox // Radiobox // Buttons // Menu // Layout } public static void main(String[] args) {. . . } public void action. Performed(Action. Event e) {. . . } } class Fermeur extends Window. Adapter {. . . } class Menu. Action. Listener implements Action. Listener {. . . } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 31

Texte et options Java AWT et Swing Tout() { // Text. Field Panel tf.

Texte et options Java AWT et Swing Tout() { // Text. Field Panel tf. Panel = new Panel( new Flow. Layout(Flow. Layout. LEFT)); tf. Panel. set. Background(Color. light. Gray); tf. Panel. add(new Label("Text. Field")); tf = new Text. Field(15); tf. Panel. add(tf); // Choice Panel ch. Panel = new Panel( new Flow. Layout(Flow. Layout. LEFT)); ch. Panel. set. Background(Color. light. Gray); ch. Panel. add(new Label("Choice")); ch = new Choice(); ch. add. Item("Solaris"); ch. add. Item("Linux"); ch. add. Item("Mac. OS"); ch. Panel. add(ch); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 32

Liste et boutons à cocher Java AWT et Swing // List Panel ls. Panel

Liste et boutons à cocher Java AWT et Swing // List Panel ls. Panel = new Panel( new Flow. Layout(Flow. Layout. LEFT)); ls. Panel. set. Background(Color. light. Gray); ls = new List(); ls. add("Motif"); ls. add("AWT"); ls. add("Windows"); ls. Panel. add(new Label("List")); ls. Panel. add(ls); // Checkbox Panel cb. Panel = new Panel( new Flow. Layout(Flow. Layout. LEFT)); cb. Panel. set. Background(Color. light. Gray); cb. Panel. add(cb. Solaris = new Checkbox("Solaris")); cb. Panel. add(cb. Linux = new Checkbox("Linux")); cb. Panel. add(cb. Mac. Os = new Checkbox("Mac. OS")); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 33

Boutons radio et boutons simples Java AWT et Swing // Radiobox Panel rb. Panel

Boutons radio et boutons simples Java AWT et Swing // Radiobox Panel rb. Panel = new Panel( new Flow. Layout(Flow. Layout. LEFT)); rb. Panel. set. Background(Color. light. Gray); //Checkbox. Group (logique) rb. Group = new Checkbox. Group(); rb. Panel. add(new Checkbox("Solaris", rb. Group, true)); rb. Panel. add(new Checkbox("Linux", rb. Group, false)); rb. Panel. add(new Checkbox("Mac. OS", rb. Group, false)); // Buttons Panel bt. Panel = new Panel( new Grid. Layout(1, 0, 3, 3)); Button ok = new Button("ok"); Button cancel = new Button("annuler"); Button quitter = new Button("quitter"); bt. Panel. add(ok); bt. Panel. add(cancel); bt. Panel. add(quitter); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 34

Action. Listener do. It = new Menu. Action. Listener(); Menu. Item m; Menu Java

Action. Listener do. It = new Menu. Action. Listener(); Menu. Item m; Menu Java AWT et Swing Menu proc. Menu = new Menu("proceduraux"); proc. Menu. add(m = new Menu. Item("Pascal")); m. add. Action. Listener(do. It); proc. Menu. add(m = new Menu. Item("C")); m. add. Action. Listener(do. It); Menu funct. Menu = new Menu("fonctionnels"); funct. Menu. add(m = new Menu. Item("Lisp")); m. add. Action. Listener(do. It); funct. Menu. add(m = new Menu. Item("ML")); m. add. Action. Listener(do. It); Menu obj. Menu = new Menu("objets"); obj. Menu. add(m = new Menu. Item("C++")); m. add. Action. Listener(do. It); obj. Menu. add(m = new Menu. Item("Smalltalk")); m. add. Action. Listener(do. It); Menu langages. Menu = new Menu("Langages"); langages. Menu. add(proc. Menu); langages. Menu. add(funct. Menu); langages. Menu. add(obj. Menu); Menu. Bar b. Menu = new Menu. Bar(); b. Menu. add(langages. Menu); set. Menu. Bar(b. Menu); class Menu. Action. Listener implements Action. Listener { public void action. Performed(Action. Event e) { System. out. println("Menu : " + e. get. Action. Command()); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 35

Assemblage des panneaux Java AWT et Swing Tout() {. . . // Layout set.

Assemblage des panneaux Java AWT et Swing Tout() {. . . // Layout set. Layout(new Grid. Bag. Layout()); Grid. Bag. Constraints gbc =new Grid. Bag. Constraints(); gbc. fill = Grid. Bag. Constraints. BOTH; gbc. gridwidth = Grid. Bag. Constraints. REMAINDER; gbc. insets = new Insets(5, 0, 0, 0); // top add(tf. Panel, gbc); add(ch. Panel, gbc); add(ls. Panel, gbc); add(cb. Panel, gbc); add(rb. Panel, gbc); gbc. insets = new Insets(5, 0, 5, 0); // top-bottom add(bt. Panel, gbc); } n Un objet Grid. Bag. Constraints dit comment disposer n NB un Grid. Layout produit des blocs de même taille Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 36

Les actions Java AWT et Swing public static void main(String[] args) { Tout t

Les actions Java AWT et Swing public static void main(String[] args) { Tout t = new Tout(); t. pack(); t. set. Visible(true); t. add. Window. Listener(new Fermeur()); } public void action. Performed(Action. Event e) { if (e. get. Action. Command(). equals("quitter")) System. exit(0); System. out. println("text. Field = "+tf. get. Text()); System. out. println("choice = "+ch. get. Selected. Item()); System. out. println("list = "+ls. get. Selected. Item()); System. out. println("checkbox = "+cb. Solaris. get. State() +" "+cb. Linux. get. State()+" "+cb. Mac. Os. get. State()); System. out. println("radiobox = " +rb. Group. get. Selected. Checkbox(). get. Label()); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 37

Swing n Java AWT et Swing est une extension des AWT l l l

Swing n Java AWT et Swing est une extension des AWT l l l nombreux nouveaux composants nombreuses facilités séparation entre u modèle (données) u aspect visuel (UI) u contrôle n Les composants sont légers, sauf JApplet, JWindow, JFrame, JDialog n Ces derniers ont une structure spéciale Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 38

JFrame n Une JFrame contient une fille unique, de la classe JRoot. Pane n

JFrame n Une JFrame contient une fille unique, de la classe JRoot. Pane n Cette fille contient deux filles, glass. Pane (JPanel) et layered. Pane (JLayered. Pane) n La layered. Pane a deux filles, content. Pane (JPanel) et menu. Bar (null JMenu. Bar) n On travaille dans content. Pane. n JApplet, JWindow et JDialog sont semblables. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Java AWT et Swing class Tout extends JFrame { Tout() { JPanel panel; get. Content. Pane(). add(panel); . . . } 39

Modèles et vues n Les composants (sauf les conteneurs) ont un modèle qui contient

Modèles et vues n Les composants (sauf les conteneurs) ont un modèle qui contient les données associées l l l n Button. Model pour les boutons List. Model pour les données d’un JList Table. Model pour les JTable Tree. Model pour les JTree Document pour tous les composants de texte La vue d’un composant sont aggrégés en un délégué UI (User Interface) l l l n Java AWT et Swing détermine le look-and-feel du composant (bord, couleur, ombre, forme des coches) peut-être changé est parfois spécifié par un dessinateur (renderer) à un niveau plus élevé un changement global, pour tous les composants, est le pluggable look and feel (plaf) trois implémentations (quatre ave le Mac) existent : Windows, CDE/Motif, Metal (défaut). Le contrôle est assuré par le modèle. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 40

L’exemple en Swing n Comporte l l n deux menus (JMenu) des panneaux (JPanel)

L’exemple en Swing n Comporte l l n deux menus (JMenu) des panneaux (JPanel) organisés dans un Box. Layout vertical Les panneaux contiennent l l l l n Java AWT et Swing des étiquettes (JLabel) un champ de texte (JText. Field) une liste (JList) et une combobox (JCombo. Box) des boutons à cocher (JCheck. Box) des bordures (Titled. Border ici) des boutons radio (JRadio. Button) des boutons ordinaires (JButton) Trois auditeurs (Action. Listener) l l l pour les boutons du bas pour le menu des langages pour le menu plaf Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 41

Structure d’ensemble class JTout extends JFrame nimplements Le constructeur JTout() Action. Listener { met

Structure d’ensemble class JTout extends JFrame nimplements Le constructeur JTout() Action. Listener { met JText. Field tf; composants en place les JCombo. Box ch; JList ls; cb. Solaris, cb. Linux, cb. Mac. Os; n. JCheck. Box Tout est sont propre auditeur Button. Group rb. Group; pour le{ bouton ok. JTout() // JText. Field // JCombo. Box JList n//Les actions sur le menu sont // Check. Box //auditionnées Radio. Box et séparément Button. Group // Buttons // Menu langages // Menu plaf } public static void main(String[] args) { JTout t = new JTout(); t. pack(); t. set. Visible(true); t. add. Window. Listener(new Fermeur()); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Java AWT et Swing 42

Texte et Combo. Box n Java AWT et Swing Le texte ne change pas,

Texte et Combo. Box n Java AWT et Swing Le texte ne change pas, le composant Choice s’appelle JCombo. Box // JText. Field JPanel tf. Panel = new JPanel(new Flow. Layout(Flow. Layout. LEFT)); tf. Panel. add(new JLabel("Text. Field")); tf = new JText. Field(15); tf. Panel. add(tf); // JCombo. Box JPanel ch. Panel = new JPanel(new Flow. Layout(Flow. Layout. LEFT)); ch. Panel. add(new JLabel("Combobox")); ch = new JCombo. Box(); ch. add. Item("Solaris"); ch. add. Item("Linux"); ch. add. Item("Mac. OS"); ch. Panel. add(ch); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 43

Listes n JList prend ses données dans un List. Model. Un vecteur en est

Listes n JList prend ses données dans un List. Model. Un vecteur en est un, mais tout tableau d’objets (Object[] ) est accepté dans un constructeur et converti. n Sélection régie par un List. Selection. Model n Affichage personnalisé par un List. Cell. Renderer Java AWT et Swing JPanel ls. Panel = new JPanel(new Flow. Layout(Flow. Layout. LEFT)); String[] donnees = { "Motif", "AWT", "Windows", "Swing" , "Ilog. Views", "XWindow", "Tcl/Tk", "gtk", "gnome"}; ls = new JList(donnees); ls. Panel. add(new JLabel("Liste")); ls. Panel. add(new JScroll. Pane(ls)); // ascenseur Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 44

Java AWT et Swing Ajouter et supprimer dans une liste n On ajoute au

Java AWT et Swing Ajouter et supprimer dans une liste n On ajoute au modèle : JList ls. . . ls. get. Model(). add. Element(string); // à la fin ls. get. Model(). add(position, string); n On retranche du modèle : JList ls. . . ls. get. Model(). remove(position); n On récupère les positions sélectionnées par: int[] positions = ls. get. Selected. Indices(); int position = ls. get. Selected. Index(); //premier Object[] values = ls. get. Selected. Values(); Object value = ls. get. Selected. Value(); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 45

Boutons à cocher n Checkbox en JCheck. Box n De nombreuses bordures existent (importer

Boutons à cocher n Checkbox en JCheck. Box n De nombreuses bordures existent (importer javax. swing. border. * ) Java AWT et Swing JPanel cb. Panel = new JPanel(new Flow. Layout(Flow. Layout. LEFT)); cb. Panel. set. Border(new Titled. Border("Boutons a cocher")); cb. Panel. add(cb. Solaris = new JCheck. Box("Solaris")); cb. Panel. add(cb. Linux = new JCheck. Box("Linux")); cb. Panel. add(cb. Mac. Os = new JCheck. Box("Mac. OS")); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 46

Boutons radio n Un JRadio. Button est ajouté l l Java AWT et Swing

Boutons radio n Un JRadio. Button est ajouté l l Java AWT et Swing au conteneur physique au conteneur logique (un Button. Group) JPanel rb. Panel = new JPanel(new Flow. Layout(Flow. Layout. LEFT)); rb. Panel. set. Border(new Titled. Border("Boutons radio")); rb. Group = new Button. Group(); JRadio. Button rb; rb = new JRadio. Button("Solaris", true); rb. set. Action. Command("Solaris"); rb. Panel. add(rb); rb. Group. add(rb); rb = new JRadio. Button("Linux", false); rb. set. Action. Command("Linux"); rb. Panel. add(rb); rb. Group. add(rb); rb = new JRadio. Button("Mac. OS", false); rb. set. Action. Command("Mac. OS"); rb. Panel. add(rb); rb. Group. add(rb); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 47

La lecture des valeurs n Java AWT et Swing Le nom de la méthode

La lecture des valeurs n Java AWT et Swing Le nom de la méthode dépend (encore) du composant: public void action. Performed(Action. Event e) { // boutons if (e. get. Action. Command(). equals("quitter")) System. exit(0); System. out. println(); // Texte : get. Text() System. out. println( "textfield = " + tf. get. Text()); // Combo. Box : get. Selected. Item() System. out. println( "combobox = " + ch. get. Selected. Item()); // Liste : get. Selected. Value() System. out. println( "list = " + ls. get. Selected. Value()); // Check. Box : is. Selected() System. out. println( "checkbox = " + cb. Solaris. Selected() + " " + cb. Linux. is. Selected() + " " + cb. Mac. Os. is. Selected()); // Radio : group. get. Selection(). get. Action. Command() System. out. println("radiobox = " + rb. Group. get. Selection(). get. Action. Command() ); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 48

Java AWT et Swing Assemblage n Le conteneur est le champ get. Content. Pane()

Java AWT et Swing Assemblage n Le conteneur est le champ get. Content. Pane() de JFrame n sauf pour le menu, que l’on ajoute illogiquement à get. Root. Pane() n Un “Strut” est un composant réduit à un espacement rigide. n Sa création est une méthode statique de la fabrique Box. get. Root. Pane(). set. JMenu. Bar(b. Menu); JPanel panneau = (JPanel)get. Content. Pane(); panneau. set. Layout( new Box. Layout(panneau, Box. Layout. Y_AXIS)); panneau. add(Box. create. Vertical. Strut(5)); panneau. add(tf. Panel); panneau. add(Box. create. Vertical. Strut(5)); panneau. add(ch. Panel); panneau. add(Box. create. Vertical. Strut(5)); panneau. add(ls. Panel); panneau. add(Box. create. Vertical. Strut(5)); panneau. add(cb. Panel); panneau. add(Box. create. Vertical. Strut(5)); panneau. add(rb. Panel); panneau. add(Box. create. Vertical. Strut(5)); panneau. add(bt. Panel); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 49

Look and feel n Java AWT et Swing Trois “look and feel” existent, de

Look and feel n Java AWT et Swing Trois “look and feel” existent, de noms "com. sun. java. swing. plaf. windows. Windows. Look. And. Feel" "com. sun. java. swing. plaf. motif. Motif. Look. And. Feel" "javax. swing. plaf. metal. Metal. Look. And. Feel” n On essaye de l’utiliser par UIManager. set. Look. And. Feel(lf); n et de l’appliquer à la racine de l’arbre par Swing. Utilities. update. Component. Tree. UI( Swing. Utilities. get. Root(this)); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 50

Plaf : le menu Java AWT et Swing n Le menu s’écoute lui-même. .

Plaf : le menu Java AWT et Swing n Le menu s’écoute lui-même. . . public class Plaf. Menu extends JMenu implements Action. Listener { UIManager. Look. And. Feel. Info[] lfi = UIManager. get. Installed. Look. And. Feels(); public Plaf. Menu () { super("Plaf"); Button. Group rb. Group = new Button. Group(); JRadio. Button. Menu. Item rb; String lfs = UIManager. get. Cross. Platform. Look. And. Feel. Class. Name(); String lf. Name; for (int i = 0; i < lfi. length; i++) { rb = new JRadio. Button. Menu. Item(lfi[i]. get. Name()); rb. add. Action. Listener(this); rb. Group. add(rb); lf. Name = lfi[i]. get. Class. Name(); if (lfs. equals(lf. Name)) rb. set. Selected(true); // par defaut else try { Look. And. Feel lf = (Look. And. Feel) Class. for. Name(lf. Name). new. Instance(); if (!lf. is. Supported. Look. And. Feel()) // n’est pas “supporté” par la plate-forme rb. set. Enabled(false); } catch ( Exception ex ) { rb. set. Enabled(false); } } }. . . Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 51

Plaf : changement Java AWT et Swing . . . public void action. Performed(Action.

Plaf : changement Java AWT et Swing . . . public void action. Performed(Action. Event e) { String lf. Name = null; String comm = e. get. Action. Command(); for (int i = 0; i < lfi. length; i++) if (comm. equals(lfi[i]. get. Name())) { lf. Name = lfi[i]. get. Class. Name(); break; } try { UIManager. set. Look. And. Feel(lf. Name); Swing. Utilities. update. Component. Tree. UI(Swing. Utilities. get. Root(this)); } catch ( Exception ex ) { System. err. println( "Could not load " + lf. Name ); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 52

Java AWT et Swing Actions n Moyen commode pour définir une entrée (dans un

Java AWT et Swing Actions n Moyen commode pour définir une entrée (dans un menu) et simultanément y attacher un auditeur n Entrée simultanée dans Toolbar possible n Tout changement dans l’un se reflète sur l’autre (grisé etc. ) // Menu langages. . . JMenu funct. Menu = new JMenu("fonctionnels"); funct. Menu. add(new Menu. Action("Lisp")); funct. Menu. add(new Menu. Action("ML")); . . . langages. Menu. add(proc. Menu); langages. Menu. add(funct. Menu); langages. Menu. add(obj. Menu); class Menu. Action extends Abstract. Action { public Menu. Action(String libelle) { super(libelle); } public void action. Performed(Action. Event e) { System. out. println("Menu : ” + e. get. Action. Command()); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 53

Abstract. Acti on n Abstract. Action est une classe abstraite l l l n

Abstract. Acti on n Abstract. Action est une classe abstraite l l l n elle implémente l’interface Action étend Action. Listener la seule méthode à écrire est action. Performed() Les conteneurs JMenu, JPopup. Menu et JTool. Bar honorent les actions: l l l n Java AWT et Swing un même objet d’une classe implémentant Abstract. Action peut être “ajouté” à plusieurs de ces conteneurs. les diverses instances opèrent de concert. par exemple, un objet ajouté à un menu et à une barre d’outils est activé ou désactivé simultanément dans les deux. Les classes dérivées de Abstract. Action sont utiles quand une même action peut être déclenchée de plusieurs manières. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 54

Emploi d’Abstract. Action Java AWT et Swing n Création d’une classe qui étend Abstract.

Emploi d’Abstract. Action Java AWT et Swing n Création d’une classe qui étend Abstract. Action n Utilisation comme Action. Listener Action mon. Action = new Mon. Action(); JButton b = new JButton(“Hello”); b. add. Action. Listener(mon. Action); Utilisation dans un menu et dans une barre d’outils Action copy. Action = new Mon. Action(“Copy”); JMenu menu = new JMenu(“Edit”); JTool. Bar tools = new JTool. Bar(); JMenu. Item copy. Item = menu. add(copy. Action); JButton copy. Btn = tools. add(copy. Action); n class Mon. Action extends Abstract. Action { public void action. Performed( Action. Event e ) {. . . } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 55