Info 423 Compléments de programmation Objet Contenu : Interfaces graphiques, le package AWT Multitâches, les "Threads" Fichiers Volume horaire : 9 / 9 / 12 Références Différents tutoriels Java en ligne : Support de cours Java de Philippe Durif Développons en Java, Jean Michel Doudoux Programmation Orientée Objets, Henri Garreta Penser en Java de Bruce Eckel The Java Tutorial de Sun Outils et Docummentation : http://www.oracle.com/technetwork/java/ http://www.eclipse.org/ 1 2 AWT Abstract Window Toolkit Modèle / Vue / Contrôleur (MVC) Une façon d'organiser un programme. On distingue trois entités distinctes qui sont : le modèle, la vue et le contrôleur Modèle : données manipulées par l'application Package pour la création de fenêtres d'interaction Vue affichage ou interface utilisateur 3 4 Contrôleur écouteurs, analyse de requêtes, gestion d'événements Interactions entre Le Modèle / / Le Contrôleur Package des composants graphiques : AWT : Interfaces Graphiques de base (écrites en code natif) java.awt java.awt.event Composants SWING (écrites en java au dessus de l'awt) javax.swing Swing est plus puissant que AWT, mais pour plus de clarté pédagogique on se limitera à AWT. Face aux problèmes de performance de Swing, IBM a développé sa propre bibliothèque SWT, utilisée notamment dans Eclipse. 5 6
AWT : Abstract Window Toolkit La composition d'une fenêtre AWT est hiérarchique. Elle est construite à partir des composants graphiques. A la base : les COMPOSANTS ("Component") La création de l'interface graphique d'une application autonome (main) passe par une instance de la classe Frame Cette fenêtre est le "container" des différents composants (boutons, zones de saisie, etc ) Deux types de composants : 1. Les containers qui contiennent d'autres composants (Frame, Panel,...) 7 2. Les composants atomiques qui se trouvent en feuille de la hiérarchie de composition. Il peuvent être prédéfinis (, TextField,...) ou crées. 8 Remarque : Tous les composants sont visibles par défaut, sauf les fenêtres (Frame). On doit les rendre visibles avec la méthode setvisible(true). La hiérarchie d'héritage Checkbox List différent de "hiérarchie de la composition" Exemple 1 (1/3) Choice Component (abstraite) // saisie de texte TextComponent Label Canvas // texte TextArea TextField // panneaux Panel // plusieurs lignes // une seule ligne Applet Frame Container (abstraite) Window Dialog 9 Frame 10 11 Exemple 1 (2/3) package premierexemple; public class Fenetre extends Frame { final static int HAUTEUR = 300; final static int LARGEUR = 250; public Fenetre( ) { settitle("premier exemple"); // met un titre setsize(largeur, HAUTEUR); // dim fenêtre setbackground(color.red); // couleur du fond // construit un bouton bouton = new ("Premier Composant"); // ajoute ce bouton en haut de la fenêtre add(bouton, "North"); setvisible(true); 12 package premierexemple; Exemple 1 (3/3) public class LancerFenetre { new Fenetre();
Le modèle Exemple 2 (1/5) Exemple 2 (2/5) public class Compteur { private int v; public Compteur(){ v = 0; public int valeur() { return v ; public boolean estpair() { return v % 2 == 0 ; public void raz() { v = 0 ; public void incr() { v = v + 1 ; public String tostring(){ return Integer.toString(v); Frame Label Hiérarchie de la composition: Frame (BorderLayout) EAST CENTER WEST Label 13 14 Exemple 2 (3/5) Exemple 2 (4/5) 15 public class FenetreCompteur extends Frame { private Compteur c ; // le modele final static int HAUTEUR = 50; final static int LARGEUR = 200; public FenetreCompteur (Compteur c) { this.c = c ; settitle("deuxième exemple"); setsize(largeur, HAUTEUR); // gestionnaire affichage this.setlayout(new BorderLayout()) ; 16 Label texte = new Label (c.tostring()) ; b1 = new ("Incr"); b2 = new ("Raz"); this.add (b1, BorderLayout.WEST) ; this.add (texte, BorderLayout.CENTER) ; this.add (b2, BorderLayout.EAST) ; b1.addactionlistener (new IncrListener(c,texte)) ; b2.addactionlistener (new RazListener(c,texte)) ; setvisible(true); Exemple 2 (5/5) public class LancerFenetre { Compteur c = new Compteur(); new FenetreCompteur(c); Chaque Container possède un gestionnaire de mise en page : un LayoutManager. Un LayoutManager se charge de : placer des composants, lors des appels à la méthode add ; donner une taille et une forme à chaque composant, en fonction de sa "taille préférée", de son contenu et de sa position ; replacer les composants en cas de redimensionnement. 17 18
Cinq classes (Layouts) prédéfinies qui implémentent l'interface LayoutManager BorderLayout : Par défaut pour les sous-classes de Frame (cf. exemple), Window et Dialog Elles représentent des dispositions différentes BorderLayout FlowLayout GridLayout CardLayout GridBagLayout Les plus utilisées West North Center South East Au plus cinq composants 19 20 21 Exemple BorderLayout public class PaneauBorder extends Panel { public PaneauBorder ( ) { this.setlayout(new BorderLayout()); this.setbackground(color.pink); Label texte1 = new Label("un",Label.CENTER) ; Label texte2 = new Label("deux",Label.CENTER) ; Label texte3 = new Label("trois",Label.CENTER) ; Label texte4 = new Label("quatre",Label.CENTER) ; Label texte5 = new Label("cinq",Label.CENTER) ; this.add (texte1, BorderLayout.NORTH) ; this.add (texte2, BorderLayout.WEST) ; this.add (texte3, BorderLayout.CENTER) ; this.add (texte4, BorderLayout.EAST) ; this.add (texte5, BorderLayout.SOUTH) ; 22 FlowLayout : les composants sont mis les uns après les autres, dans l'ordre de leur ajout (par défaut pour la classe Panel (et donc pour Applet)) one four two five three La dimension est renvoyée par la méthode getpreferredsize() de chaque composant 23 Exemple FlowLayout public class PaneauFlow extends Panel{ public PaneauFlow(){ this.setlayout(new FlowLayout()) ; // gestionnaire this.setbackground(color.yellow); Label a1 = new Label("un") ; TextField a2 = new TextField("deux",10) ; TextArea a3 = new TextArea("trois",3,10) ; a4 = new ("quatre") ; Checkbox a5 = new Checkbox("cinq") ; this.add (a1) ; this.add (a2) ; this.add (a3) ; this.add (a4) ; this.add (a5) ; 24 GridLayout : pour construire une grille régulière (constructeur à 2 paramètres : nb de lignes, nb de colonnes) un quatre deux cinq trois six Les dimensions sont les mêmes pours tous les composants.
25 Exemple GridLayout public class FenetrePrincipal extends Frame { final static int HAUTEUR = 150; final static int LARGEUR = 350; public FenetrePrincipal(){ // 1 ligne, 2 colonnes this.setlayout(new GridLayout(1,2)); this.add(new PaneauBorder()); this.add(new PaneauFlow()); 26 CardLayout : ajout à un container une liste de sous-containers ou de composants affichés un par un, à la manière des boites de dialogue à onglets GridBagLayout : le plus complet et le plus complexe... Autre exemple de disposition tfpanel Exemple 3 (1/6) Exemple 3 (2/6) Hiérarchie de la composition: FenetreAvecPaneaux (GridLayout) tfpanel chpanel rbpanel tbpanel chpanel rbpanel tfpanel (FlowLayout) chpanel(flowlayout) rbpanel (FlowLayout) tbpanel (FlowLayout) tbpanel Label TextField Label Choice Checkbox Checkbox 27 28 Exemple 3 (3/6) Exemple 3 (4/6) 29 public class FenetreAvecPaneaux extends Frame { final static int HAUTEUR = 300; final static int LARGEUR = 200; public FenetreAvecPaneaux(){ //Text Field Panel Panel tfpanel = new Panel(new Label label = new Label("TextField"); tfpanel.add(label); TextField textfield =new TextField(15); tfpanel.add(textfield); 30 // Choice Panel Panel chpanel = new Panel(new Label label2 = new Label("Choice"); chpanel.add(label2); Choice choix = new Choice(); choix.additem("solaris"); choix.additem("linux"); chpanel.add(choix); // Radio Panel Panel rbpanel = new Panel(new Checkbox rbsolaris = new Checkbox("Solaris"); rbpanel.add(rbsolaris); Checkbox rblinux = new Checkbox("Linux"); rbpanel.add(rblinux);
Exemple 3 (5/6) Exemple 3 (6/6) // Panel Panel btpanel = new Panel(new ok = new ("Ok"); btpanel.add(ok); cancel = new ("Cancel"); btpanel.add(cancel); new FenetreAvecPaneaux(); // fin FenetreAvecPaneaux 31 this.setbackground(color.gray); this.setlayout(new GridLayout(4,1)); this.add(tfpanel); this.add(chpanel); this.add(rbpanel); this.add(btpanel); 32 Exo pour les étudiants : texte a button b texte c 33 Le dimensionnement des composants est automatique grâce au LayoutManager. Pour donner à un composant une taille donnée, on peut redéfinir la méthode getpreferedsize de la classe Component. public class MonBouton extends { public MonBoutton(String nom) { super(nom); public Dimension getpreferredsize() { return new Dimension(100, 200); 34 Le méthode getpreferedsize() indique la taille souhaitée mais pas celle imposée. En fonction du LayoutManager, le composant pourra ou non imposer sa taille. public class TestDimension extends Frame { final static int HAUTEUR = 400; final static int LARGEUR = 400; public TestDimension (){ this.setlayout(new FlowLayout()); MonBoutton b = new MonBoutton("cliquez ici"); this.add(b); 35 Pas de Layout. On peut ne pas utiliser des Layout et placer les composants à la main en indiquant leurs coordonnées et leurs dimensions. Dans ce cas il faut appeler setlayout(null). Trois méthodes de Component permettent de positionner des composants : * setbounds(int x, int y, int largeur, int hauteur) * setlocation(int x, int y) * setsize(int largeur, int hauteur) 36 Exemple : public class FenetreSansLayout extends Frame { final static int HAUTEUR = 400; final static int LARGEUR = 400; public FenetreSansLayout(){ this.setlayout(null); // Sans Layout Label t=new Label("Hello tous!"); this.add(t); t.setbounds(50,50,150,70); // position et taille t.setbackground(color.yellow); new FenetreSansLayout();
Les menus Classes : Menu, MenuBar et MenuItem MenuBar Les menus Hiérarchie d'héritage de MenuComponent MenuBar Menu MenuItem MenuComponent (abstraite) Menu MenuItem CheckboxMenu 37 38 Les menus Classes d'affichage de menus: MenuBar. Seul Frame peut avoir une barre de menu. On attache une barre de menu avec la méthode setmenubar(menubar) Menu. Créé avec un titre. Par la suite on lui ajoute des items avec la méthode add. MenuItem qui peuvent être : - des chaînes de caractères, ou - des menus Menu (sous-classe de MenuItem). Code de l'exemple : Exemple 4 (1/2) public class FenetreAvecMenus extends Frame { final static int HAUTEUR = 200; final static int LARGEUR = 200; public FenetreAvecMenus(){ this.settitle("mes information"); Menu formation = new Menu("Formation"); Menu loisirs = new Menu("Loisirs"); Menu musique = new Menu("Musique"); 39 40 formation.add(new MenuItem("Pascal")); formation.add(new MenuItem("Java")); Exemple 4 (2/2) Code de l'exemple : loisirs.add(new MenuItem("Sport")); loisirs.add(new MenuItem("Cinéma")); loisirs.add(musique); musique.add(new MenuItem("Classique")); musique.add(new MenuItem("Jazz")); musique.add(new MenuItem("Pop")); 41 MenuBar mb = new MenuBar(); mb.add(formation); mb.add(loisirs); this.setmenubar(mb);