Iremia, R.Courdier Chapitre 4 : AWT - SWING Interface Homme Machine Java © Rémy Courdier 1996-2007 - Java AWT SWING - Version du cours 2.10 1 Sommaire AWT : Abstract Window Toolkit Applet et application Frame, Panel et Layout Composants GUI Les menus Les layouts Les images Animations Les polices Gestion des événements © Rémy Courdier 03/27/99 SWING Nouvelle hiérarchie Quelques composants Quelques Thèmes Les applets Les composants 1996-2007 - Java AWT SWING - Version du cours 2.10 2 1 Iremia, R.Courdier AWT – SWING Présentation AWT Première interface graphique proposée par Sun Appel direct au système d’exploitation pour l’affichage des composants Interface différente selon l’OS Mais + rapide Peu de composants SWING Objectif : 100% de portabilité Les composants sont dessinés par Java (seuls les codes de base accèdent à l’OS via l’AWT) Aspect identique Plus gourmand en ressources Plus de 40 composants différents © Rémy Courdier 1996-2007 - Java AWT SWING - Version du cours 2.10 3 AWT : Abstract Window Toolkit Applet - Application - AWT Applet Applets : Restrictions Code Java lancée par un navigateur Web La classe Applet est fournie dans java.applet une applet dérive d’un Panel Application code exécutable de manière autonome possède en générale une Frame AWT Couche d’interfaçage graphique portable Pour Applets et Applications Java Protocoles d’agencement d’éléments graphiques Protocoles de gestion d’événements la boite à outils AWT est fournie dans java.awt © Rémy Courdier 03/27/99 pas d’accès au disque pas de menus pas de boites de dialogues modales problèmes de gestions de boites de dialogues. Points de vigilance temps de chargements Java propose les fichier JAR (Java ARchive) : compression dans un fichier signé chargeable en une seule transaction réseau de toutes les ressources d’une applet perte d’informations possible quand l’utilisateur change de page ou ferme son navigateur inopinément 1996-2007 - Java AWT SWING - Version du cours 2.10 4 2 Iremia, R.Courdier AWT : Abstract Window Toolkit Développement d’une Applet //Fichier HTML pour Applet Les méthodes init() : invoquée lorsque l’applet est chargée pour les initialisations destroy() : invoquée lorsque l’applet est déchargée de la mémoire pour libérer les ressources utiles à l’appl stop(): invoquée chaque fois que l’applet n’est plus visible dans le browser Web et avant destroy() start() : invoquée chaque fois que l’applet est visible dans le navigateur Web et après le init() paint() : appelée pour chaque fois qu’il y a une mise à jour de la fenetre des élements graphiques de l’applet (fait partie du scénario d’”update()” d’un Component awt) © Rémy Courdier ... <applet code=“Applet1“ width=200 height=200> </applet> ... //Fichier Applet1.java import java.applet.*; import java.awt.*; public class Applet1 extends Applet { public void paint (Graphics g) { g.drawString(“applet“,25,10); } } // pour récupérer un param. String // <param name=color1 value=“vert”> // s=getParameter(“NomParam”); 1996-2007 - Java AWT SWING - Version du cours 2.10 5 AWT : Abstract Window Toolkit Développement d’une Application Java Une application Java a l’avantage ultime d’être portable sur toutes les plate-formes informatiques majeurs : MS-Windows, UNIX OSF/Motif, Mac OS7/8, OS/2 Presentation Manager, etc. // Fichier Appi.java import java.awt.*; public class Appli extends Frame { public Appli() { // constructeur joue le role // de la methode init() de // l’applet ... } Il peut y avoir certaines modifications du look-and-feel de l’OS natif induites par l’AWT qui impose son propre mécanisme de gestion des éléments d’interfaces graphique. Attention a réaliser du code 100% “pure” Java. (...Java SDK 2.0 de Microsoft, encore lui... ) public static void main (...) { Appli app = new Appli(); app.show(); } } © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 6 3 Iremia, R.Courdier AWT : Abstract Window Toolkit Principales classes “component“ de l’AWT Component : classe de base Container : gestionnaire de composants Window : Fenêtre sans bordure Frame : Fenêtre avec bordure Dialog : Boite de dialogue Panel : conteneur pour agencement Canvas : Fenêtre pour dessiner Contrôles de Dialogue : Button : Boutton Checkbox : Boite à cocher + Radio Choice : sorte de combo box Label : Texte statique List : Liste à choix Scrollbar : Barre de défilement TextArea : champs de texte multiligne TextField : champ de texte simple © Rémy Courdier Component Button Canvas Checkbox Choice Container Panel Applet Window Dialog FileDialog Label List Scrollbar TextComponent TextArea TextField 1996-2007 - Java AWT SWING - Version du cours 2.10 7 AWT : Abstract Window Toolkit Principales méthodes utiles de la classe Component void show() : void hide() : Dimension size() : void resize(int larg, int haut) : Rectangle bounds() : void enable() : void disable() : void repaint() : void update(Graphics g) : void paint(Graphics g) : void pack(): avec getPreferedSize() © Rémy Courdier 03/27/99 Affiche le composant Masque le composant Retourne la taille largeur, hauteur Re-dimensionne le composant Défini une zone rectangulaire Active le composant Désactive le composant pour demander de rafraichissement Appelé par repaint(), par défaut efface le fond Appelé par update() Redessine le composant Retaille la fenêtre principale pour l’adapter au composant 1996-2007 - Java AWT SWING - Version du cours 2.10 8 4 Iremia, R.Courdier AWT : Abstract Window Toolkit Principales autres classes de l’AWT dessin : la classe Graphics classe utilisée pour dessiner, afficher du texte, etc dans une Fenêtre exemple : drawLigne, drawRect, fillRect, fillPolygon, drawString, etc... cette classe possède également des méthodes pour changer de Font ou de Color L’accès à cette classe s’effectue généralement dans la méthode paint() des composants Agencement : les classes Layout les “layout” permettent d’agencer les Components dans un Container Ne pas positionner par programme les composants graphiques. ...Problème de résolution d’écrans, de système d’exploitation,... Panel p = new Panel(); p.setLayout(new GridLayout(2,3)); © Rémy Courdier Color Dimension Event Component Button ... Graphics Image Point MenuComponent MenuBar MenuItem Menu LayoutManager BorderLayout //West East Center // North South CardLayout //onglets simples FlowLayout //par défaut GridBagLayout//Grille flexible GridLayout //Grille 1996-2007 - Java AWT SWING - Version du cours 2.10 9 AWT : Abstract Window Toolkit Principaux types de layout © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 10 5 Iremia, R.Courdier AWT : Abstract Window Toolkit La gestion d’un menu La barre de menu : la Classe MenuBar Frame fr = new Frame(); MenuBar mb = new MenuBar(); fr.setMenuBar(mb); Menu déroulant de base : la classe Menu Menu menuFichier = new Menu (“Fichier”); Menu menuEdition = new Menu (“Edition”); Menu menuAide = new Menu (“Aide”); mb.add(menuFichier ); mb.add(menuEdition ); // menu d’aide positionné à droite de la barre mb.add(menuAide); setHelpMenu(menuAide); sous-menu dans un Menu : la classe MenuItem MenuItem itemOuvrir = new MenuItem (“Ouvrir”); MenuItem itemFermer = new MenuItem (“Fermer”); menuFichier.add(itemOuvrir); menuFichier.add(itemFermer ); menuFichier.addSeparator(); ... © Rémy Courdier 1996-2007 - Java AWT SWING - Version du cours 2.10 11 AWT : Abstract Window Toolkit Les images Classe Image représente les images de fomats normalisés : GIF, JPEG, ... Chargement d’une image : Différence de méthode selon le type de code : Application ou Applet Application : Toolkit tk= Toolkit.getDefaultToolkit(); Image uneImage = tk.getImage(“image.gif”); Applet : Image uneImage = getImage(getDocumentBase(), “image.gif”); Affichage d’une image : public void paint (Graphics g) { g.drawImage(uneImage,0,0,this); } Icone d’une fenêtre: uneFrame.setIconImage(uneImage); © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 12 6 Iremia, R.Courdier AWT : Abstract Window Toolkit Les images Par défaut le chargement réel des images s’effectue lors de son l’affichage Principe pour forcer le chargement des images au début du programme public void chargeFond(String strFond) { MediaTracker tracker = new MediaTracker(this); Image m_fond = Toolkit.getDefaultToolkit().getImage(strFond); // Force le chargement de l'image tracker.addImage(m_fond,0); try { tracker.waitForID(0); } catch (InterruptedException e) { System.err.println(e); } } © Rémy Courdier 1996-2007 - Java AWT SWING - Version du cours 2.10 13 AWT : Abstract Window Toolkit Animation Une animation consiste à afficher une suite d’images et à forcer le rafraîchissement public void paint(Graphics g) { g.drawImage(mesImage[numimage],x,y,this); } while(true) { x+= vitessex; y+= vitessey; numimage++; repaint(); } Pour éviter le scintillement, méthode du doublebuffering // Buffer offscreen Image bufferImage; Graphics bufferGraphics; public void update(Graphics g) { // création d’une image non visible et son «Graphic» if (bufferImage==null) { bufferImage = createImage(getSize().width,getSize().height); bufferGraphics = bufferImage.getGraphics(); } // réalisation de tous nos dessins sur cette image paint(bufferGraphics); // « transfert » de l’image sur l’écran g.drawImage(bufferImage,0,0,this); } © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 14 7 Iremia, R.Courdier AWT : Abstract Window Toolkit Les Polices de caractères Classe Font représente une police de caractères indépendante de l’OS Récupération de la liste des polices disponibles String strFontTab []; strFontTab = (Toolkit.getDefaultToolkit()).getFontList(); system.out.println(“nombre de polices : “ + strFontTab.length); for (int i = 0; i< strFontTab.length; i++){ // affiche chaque nom de police Helvetica, Arial, ... System.out.println(strFontTab[i]); } Sélection d’une Font : Label unLabel; // une zone de texte unLab.setFont(new Font(“Courier“, Font.Bold, 12); © Rémy Courdier 1996-2007 - Java AWT SWING - Version du cours 2.10 15 AWT – SWING Les évènements Programmation événementielle pilotage du code par des événements (si click de souris alors…) Les environnements actuels multi-fenêtres X Windows, MS-Windows, Mac OS,... utilisent ce principe Principe Tout component peut déclencher un événement Chaque type d’événement est défini par une classe spécifique Lorsqu’un événement est déclenché il peut être capté par des “listeners” (écouteurs) qui réalisent alors des traitements appropriés La source d’un événement et les traitements associés sont séparés © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 16 8 Iremia, R.Courdier AWT – SWING Les évènements Quelques Listeners (écouteurs) Clavier: KeyListener Clicks de la souris: MouseListener Déplacement de la souris: MouseMotionListener Roulette de la souris: MouseWheelListener Ouverture,Femeture….Fenêtre: WindowListener Changement de valeur dans une zone de texte: TextListener Action (p.ex appui sur un boutton) : ActionListener HyperlinkListener, MenuListener….. Voir java.awt.event et javax.swing.event © Rémy Courdier 1996-2007 - Java AWT SWING - Version du cours 2.10 17 AWT – SWING Les évènements Soit XXXEvent un Type d’Event peut être ActionEvent, KeyEvent, FocusEvent, MouseEvent,... pour capter un événement XXXEvent on s’enregistre auprès du Event Handler avec un XXXListener unComponent.addXXXListener(new CListener()); // désactivation par : removeXXXListener(); on implémente notre Classe Listener class CListener implements XXXListener { ...// définir ici toutes les méthodes de XXXListener } // OU lorsque XXXListener définit plusieurs méthodes class CListener extends XXXAdapter { ...// définir ici certaines méthodes de XXXListener } On peut aussi utiliser une classe anonyme monboutton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println(«boutton » +e.getSource()+« appuyé»); } }); © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 18 9 Iremia, R.Courdier AWT : Abstract Window Toolkit La gestion des événements : exemple /** Fichier AppEvent.java */ import java.awt.* import java.awt.event.* import java.applet.* public class AppEvent extends Applet { Button b1 = new Button(“Bouton1”), b2 = new Button(“Bouton2”); TextField t1 = new TextField(30); public init() { b1.addActionListener(new LB1()); b2.addActionListener(new LB2()); t1.addTextListener(new LT1T()); t1.addActionListener(new TK1A()); t1.addKeyListener(new TK1K()); add(b1); add(b2); add(t1); } public class LB1 implements ActionListener { public void actionPerformed (ActionEvent e) ...} © Rémy Courdier public class TK1K extends KeyAdapter { public void KeyTyped (KeyEvent e) { if (e.getKeyChar() == KeyEvent.VK_BACK_SPACE) {...} ...} public static void main (...) { AppEvent myApplet = new AppEvent(); Frame aFrame =new Frame(“titre”); WindowAdapter wa = new WindowAdapter() { public void windowClosing (WindowEvent e) { system.exit(0); } aFrame.addWindowListener (wa); aFrame.add(“Center”, myApplet); aFrame.setSize(250,250); myApplet.init(); myApplet.start(); aFrame.setVisible(true); } } // programme Appli ou Applet 1996-2007 - Java AWT SWING - Version du cours 2.10 19 Java AWT Couleurs du “desktop” Les couleurs de l’environnement graphique (Bureau) courant sont initialisés automatiquement dans des variables static de la classe SystemColor deskstop activeCaption activeCaptionText activeCaptionBorder inactiveCaption inactiveCaptiveText inactiveCaptionBorder window windowBorder windowText menu © Rémy Courdier 03/27/99 menuText text textText textHighlight textHighlightText textInactiveText control controlText controlHighlight controlLtHighlight controlShadow controlDkShadow scrollbar info infoText 1996-2007 - Java AWT SWING - Version du cours 2.10 20 10 Iremia, R.Courdier Java AWT Impression l’impression est possible depuis les application Java mais pas depuis une Applet Java /** objet PrintJob */ ... class PrintData { public PrintJob pj; public int pageWidth, pageHeight; PrintData(String jobName) { pj = getToolkit().getPrintJob( PrintDemo.this, jobName, null); if (pj!= null) { récupération d’un objet PrintJob depuis un objet Toolkit par la méthode getPrintJob() pW=pj.getPageDimension().width; les mécanismes d’impression Java ne sont pas completement automatisés pH=pj.getPageDimension().height; g = pj.getGraphics; } } } © Rémy Courdier 1996-2007 - Java AWT SWING - Version du cours 2.10 21 AWT Le presse-papier “clipboard” Fonctionnalités offertes Java supporte un certain nombre de fonctionnalités du clipboard uniquement sur les String possibilité de copier un objet String dans le clipboard au format text et de lire un texte du clipboard dans un String le modèle de gestion du clipboard est extensible avec la notion de “Flavors” Principe import java.awt.datatransfer.* ... Clipboard cl = getToolkit().getSystemClipboard(); ... cl.setcontents(aClipString, aClipString); ... Transferable clipData=cl.getcontents(...); try { ClipString = (String)clipData.getTransferData(DataFlavor.stringFlavor); catch { /* exception levé si pas de stringFlavor dans le clipboard ...*/ } © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 22 11 Iremia, R.Courdier Sommaire AWT : Abstract Window Toolkit Applet et application Frame, Panel et Layout Composants GUI Les menus Les layouts Les images Animations Les polices Gestion des événements © Rémy Courdier SWING Nouvelle hiérarchie Quelques composants Quelques Thèmes Les applets Les composants 1996-2007 - Java AWT SWING - Version du cours 2.10 23 SWING Différences par rapport à l’AWT Plus grande variété de composants Arbres, Tables, ToolTips.. boutons avec images, bordures… Gestion des thèmes «LookAndFeel » Selon l’OS: Windows,MacOs… Thémes personnalisés… Gestion automatique du double buffering S’appuie en partie sur l’AWT Consommateur de ressources © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 24 12 Iremia, R.Courdier Swing Une nouvelle hiérarchie © Rémy Courdier 1996-2007 - Java AWT SWING - Version du cours 2.10 25 SWING Quelques composants © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 26 13 Iremia, R.Courdier Swing Quelques « Look & Feel » © Rémy Courdier 1996-2007 - Java AWT SWING - Version du cours 2.10 27 Swing Les applets Comme un pluggin standard: Java Plug In Utilisation d'une autre balise que APPLET OBJECT dans le cas de Explorer. EMBED dans le cas de Netscape. <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 50 codebase="http://java.sun.com/products/plugin/1.1.2/jinstall112-win32.cab#Version=1,1,2,0"> L’outil de SUN HTML Converter Il permet de convertir les balises APPLET en OBJECT/EMBED avec des scripts d’installation automatique du pluggin © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 28 14 Iremia, R.Courdier Swing Les composants De haut niveau JFrame, JDialog & JApplet Pour leur ajouter des composants, il faut passer par leur ContentPane maFenetre.getContentPane(). add(new JButton(« test »)); Intermédiaires Les JPanel, JScrollPane,JTabbedPane monPanel.add(new JScrollPane(new JLabel(«Test »))); Atomiques Les JButton, JLabel…. © Rémy Courdier 1996-2007 - Java AWT SWING - Version du cours 2.10 29 Références Trail: Creating a GUI with JFC/Swing http://java.sun.com/docs/books/tutorial/uiswing/ Le langage JAVA http://cedric.cnam.fr/~farinone/Java/ © Rémy Courdier 03/27/99 1996-2007 - Java AWT SWING - Version du cours 2.10 30 15