4Slides
Transcription
4Slides
Les GUIs en Java Définition Nicolas Nobelis IUT R&T Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 1 GUI = Graphical User Interface. Ces interfaces permettent à l'utilisateur de dialoguer de manière conviviale avec le logiciel. Le développement des GUI s'effectue, mis à part quelques cas précis, APRÈS le développement du logiciel proprement dit. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis Les GUIs en Java Swing Il existe plusieurs toolkits graphiques : AWT et Swing sont étroitement liés : AWT (Abstract Window Toolkit) : le tout premier proposé par Sun (développé en 30 jours). Implémentation via des composants natifs. Peu de composants disponibles. Swing : librairie pure Java, construite au dessus d'un sousensemble d'AWT. De nombreux composants disponibles (arbre, menus, sélecteur). Entièrement portable mais plutôt lent. SWT (Standard Widget Toolkit) : librairie nouvelle génération soutenue par le projet Eclipse. Implémentation native et nombreux composants. Très rapide. Portabilité limitée. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 2 3 La majeure partie des classes AWT existe dans Swing (e.g. Button et JButton). La programmation Swing nécessite de temps en temps l'usage de classes AWT (en particulier pour les événements et les polices) : privilégier, quand c'est possible, l'utilisation des classes Swing. les classes s'obtiennent en important les paquetages suivants : java.awt.*; javax.swing.*; Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 4 Les différents composants Swing : JFrame Les JFrame : une fenêtre. Méthodes intéressantes : ImageIcon ii = new ImageIcon("icon.png"); JLabel jl = new JLabel("text + icône", ii, JLabel.CENTER); setTitle(String) pour mettre le titre de la fenêtre. setSize(int longueur, int hauteur). setLocation(int x, int y) pour déplacer la fenêtre. dispose() pour fermer la fenêtre. pack() ajuste chaque composant à sa taille optimale et retaille la fenêtre. setDefaultCloseOperation(int constante) spécifie l'action à effectuer quand on clique sur la croix en haut à droite. Par ex. : JFrame.DISPOSE_ON_CLOSE. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 5 Les différents composants Swing (3) : JButton Les différents composants Swing (2) : JLabel Méthodes intéressantes : Méthodes intéressantes : setEnabled(boolean) pour activer/désactiver une zone de texte. setHorizontalAlignement(cste) pour contrôler l'alignement de texte. cste = JLabel.LEFT, JLabel.CENTER, etc... Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 6 Les différents composants Swing (4) : JOptionPane JOptionPane.showMessageDialog(null, "Faille du noyau...", "Alerte ", JOptionPane.ERROR_MESSAGE); setEnabled(booléen) pour activer ou désactiver un bouton. setText(String) pour changer le texte du bouton. int retour = JOptionPane.showConfirmDialog(null, "Voulez vous continuer ?", "Question",JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); setMnemonic(char) pour enregistrer quel caractère est accessible par mnémonique (i.e. quand on presse alt et le mnémonique, le bouton est activé). Les GUI en Java. (C) 2005-2006 Nicolas Nobelis System.out.println("Est ce que oui a été choisit ? " + (retour == JOptionPane.YES_OPTION)); 7 Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 8 Les différents composants Swing (5) Les différents composants Swing (6) Voici une liste non exhaustive d'autres composants (consulter la Javadoc pour les utiliser) : JMenu et JMenuItem : un menu et ses éléments. JPanel : un conteneur vide. JComboBox : liste à plusieurs valeurs souvent utilisé dans les formulaires web. JPopMenu : un menu flottant (souvent utilisé dans les clics droits). JToolBar : une barre d'outils. JTextField : une ligne de texte. JToolTip : une bulle d'aide. JTextArea : une zone de texte. JTree : une structure arborescente. JCheckBox : petite boite à cocher. JFileChooser : un sélecteur de fichier. JRadioButton : un groupe de petits boutons ronds à choix unique. JColorChooser : un sélecteur de couleur. 9 Les GUI en Java. (C) 2005-2006 Nicolas Nobelis Architecture JProgressBar : une barre de remplissage. JList : une liste. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 10 Un exemple Tous les composants Swing héritent de la super-classe JComponent. Comme JComponent hérite de java.awt.Container, tous les composants Swing peuvent contenir d'autres composants. Les composants s'ajoutent par : Container.add(<JComponent>) placement avec une contrainte par défaut. Container.add(<JComponent>, <Object>) placement avec une contrainte spécifiée. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 11 Cette fenêtre peut s'obtenir de deux manières : par composition et par spécialisation. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 12 Un exemple : composition Un exemple : spécialisation import javax.swing.*; import javax.swing.*; public class GUITest2 extends JFrame { public class GUITest { public GUITest2 (int largeur, int hauteur) { super("Le titre de la fenetre"); JLabel texte = new JLabel("Hello World"); JButton bu = new JButton("Yes, Hello !"); public static void main (String[] args) { JFrame j = new JFrame("Le titre de la fenetre"); JLabel texte = new JLabel("Hello World"); JButton bu = new JButton("Yes, Hello !"); add(texte, java.awt.BorderLayout.NORTH); add(bu, java.awt.BorderLayout.SOUTH); j.add(texte, java.awt.BorderLayout.NORTH); j.add(bu, java.awt.BorderLayout.SOUTH); setSize(largeur, hauteur); setVisible(true); } j.setSize(400, 300); j.setVisible(true); public static void main (String[] args) { GUITest2 f = new GUITest2(400, 300); } }//END OF CLASS } }//END OF CLASS Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 13 Les GUI en Java. (C) 2005-2006 Nicolas Nobelis Utilisation Mise en page Que faut-t-il utiliser ? La spécialisation ou la composition ? dans une utilisation normale, la composition est plus efficace car elle vous permet de minimiser le nombre de lignes de code à écrire. dans le cas où vous devez utiliser plusieurs composants ad-hoc, il vaut mieux choisir la spécialisation. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 14 15 Comment s'effectue la mise en page des composants dans le conteneur ? Tous les conteneurs disposent d'une méthode setLayout qui permet de spécifier le gestionnaire de mise en page à utiliser. Lors de l'ajout d'un nouveau composant dans un autre (via la méthode add), on peut préciser un paramètre de contrainte. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 16 Les différents gestionnaires : BorderLayout (1) Ce layout est celui par défaut dans les JFrame. La zone est divisée en 5 parties Les différents gestionnaires : GridLayout (2) Ce layout divise la zone sous la forme d'une grille. Le constructeur prend le nombre de lignes et le nombre de colonnes. import javax.swing.*; import java.awt.GridLayout; import javax.swing.*; import java.awt.BorderLayout; public class GUITest4 { public class GUITest3 { public static void main (String[] args) { JFrame j = new JFrame(); public static void main (String[] args) { JFrame j = new JFrame(); j.setLayout(new GridLayout(3, 2)); j.setLayout(new BorderLayout()); for (int i = 1; i < 7 ; i++) { j.add(new JButton("But " + i)); } ... j.add(new JButton("Nord"), BorderLayout.NORTH); j.add(new JButton("Sud"), BorderLayout.SOUTH); ... Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 17 Les GUI en Java. (C) 2005-2006 Nicolas Nobelis Les différents gestionnaires : FlowLayout (3) Ce layout est celui par défaut dans les JPanel. Ce layout remplit la zone au fur et à mesure, en allant à la ligne quand il n'y a plus de place. Les différents gestionnaires (4) import javax.swing.*; import java.awt.FlowLayout; public class GUITest5 { public static void main (String[] args) { JFrame j = new JFrame(); 18 Il existe d'autres LayoutManager : BoxLayout : la zone est divisée en cellules de même hauteur mais de longueurs différentes. GridBagLayout : la zone est divisée en cellules de taille variable. Il est possible de paramétrer la manière dont l'espace supplémentaire est alloué à chaque cellule. Complexe ! j.setLayout(new FlowLayout(FlowLayout.CENTER)); for (int i = 1; i < 7 ; i++) { j.add(new JButton("But " + i)); } ... Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 19 Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 20 Les bordures Les événements Les JComponents peuvent se voir attribuer une bordure par la méthode setBorder(Border) Programmation par événement : 1) Un écouteur s'abonne à une source. Pour obtenir une bordure, utiliser les méthodes statiques de la classe BorderFactory (createEtchedBorder, ...) 2) La source déclenche l'événement. 3) La source le passe aux abonnés. 4) Les abonnés réagissent. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 21 Les événements (2) : exemple Les composants sont des sources. Événements déclenchés par une action utilisateur. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 22 Les événements (3) : exemple import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GUITest7 extends JFrame { JLabel lb; // variable globale sinon le listener ne peut y accéder public GUITest7 () { super("Le titre de la fenetre"); setLayout(new FlowLayout(FlowLayout.CENTER)); JButton hb = new JButton("Push for hello"); lb = new JLabel("Hello Monde"); hb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { lb.setText("OUCH !"); } }); add(hb); add(lb); Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 23 Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 24 Les événements (4) Les événements (5) Voici les principales classes d'écouteur : Les plus utilisées sont : ActionListener. ItemListener. Il existe aussi des listeners spécifiques : MouseListener, MouseAdapter (pour la souris). KeyListener, KeyAdapter (pour les événements clavier). WindowListener, WindowAdapter (pour les fenêtres). Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 25 Si vous implémentez un <XXX>Listener, vous vous engagez à écrire le code de toutes ses méthodes. Dans certains cas (e.g. MouseListener), il y a beaucoup de méthodes à redéfinir. Dans ces cas là, utilisez un <XXX>Adapter : vous ne redéfinissez que le corps des méthodes qui vous intéresse. Les GUI en Java. (C) 2005-2006 Nicolas Nobelis Le dessin Le dessin (2) Le dessin dans Swing est fondé sur : les classes : public abstract class java.awt.Graphics public abstract class java.awt.Graphics2 les méthodes de javax.swing.JComponent : Méthodes de Graphics : drawArc drawImage drawLine drawOval drawPolygon paintComponent(Graphics) drawRect paint(Graphics) drawString repaint() getColor Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 26 27 ... Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 28 Le dessin (3) : exemple Le dessin (4) : exemple public class GUITest8 extends JPanel { public GUITest8 () { } // pour éviter que pack diminue la zone d'affichage en dessous d'une certaine zone public Dimension getPreferredSize() { return new Dimension(400, 300); } // méthode appelée quand le panneau doit être redessiné public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.BLACK); g.drawString("Hello World", 10, 10); g.setColor(Color.RED); g.fillOval(100, 50, 30, 70); g.setColor(Color.BLUE); g.fill3DRect(300, 80, 50, 40, true) ; } Nous allons créer un composant spécifique : un JPanel qui contient un dessin. } Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 29 Le Look And Feel Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 30 Le Look And Feel (2) Par défaut, toutes les fenêtres de Swing ont le même aspect, quelque soit la plate-forme. Il est néanmoins de possible de changer d'aspect. Ces aspects s'appellent des Look And Feel (LAF). On peut, sur une plate forme donnée, choisir le LAF par défaut (CrossPlatformLookAndFeel) le LAF du système courant (SystemLookAndFeel) le LAF d'un autre système, si les licences le permettent (e.g. le LAF Windows n'est pas disponible sur Linux). Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 31 LAF par défaut (Métal) LAF Unix (Motif) LAF Linux (Gtk) LAF Windows Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 32 Astuce : comment centrer une fenêtre ? Le Look And Feel (3) JFrame f = new JFrame(); // récupère la liste des LAF UIManager.LookAndFeelInfo[] leslafs = UIManager.getInstalledLookAndFeels(); // affiche cette liste for (int i = 0; i < leslafs.length ; i++) { System.out.println(leslafs[i].getClassName()); } try { // met le troisième LAF UIManager.setLookAndFeel(leslafs[2].getClassName()); } catch (ClassNotFoundException x) { x.printStackTrace(); } catch (InstantiationException x1) { x1.printStackTrace(); } catch (IllegalAccessException x2) { x2.printStackTrace(); } catch (UnsupportedLookAndFeelException x3) { x3.printStackTrace(); } SwingUtilities.updateComponentTreeUI(f); Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 33 Références Cette présentation est fondée sur les travaux suivants : cours d'interface graphique de Peter Sander : http://www.essi.fr/~sander/courses/prog101/GUI/ cours d'interface graphique de Yannis Bres : http://www.yannis.bres.name/Teaching/ESSI/2/AWT-Swing/ cours d'interface graphique de Jean Berstel : http://wwwigm.univ-mlv.fr/%7Eberstel/Cours/liste.html Pour aller plus loin sur les interfaces graphiques, je vous recommande l'excellent livre (un peu vieux) : Java Foundation Classes in a Nutshell de David Flanagan http://www.oreilly.com/catalog/jfcnut/ Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 35 La méthode statique suivante centre une fenêtre. Il faut l'appeler juste après les pack et setSize et juste avant le setVisible(true) : public static void centerJFrame(JFrame j) { int h = j.getHeight(); int l = j.getWidth(); java.awt.Dimension d = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); j.setLocation(d.width/2-l/2, d.height/2-h/2); } Les GUI en Java. (C) 2005-2006 Nicolas Nobelis 34