Component - Container
Transcription
Component - Container
Plan Objectif : maitriser le développement d’interfaces graphiques en Java connaissance des API AWT et Swing de composants graphiques gestion des événements et du comportement de ces composants apprentissage d’une bonne pratique de structuration des applications (modèle MVC) Plan 1- rappels sur AWT, ses conteneurs, ses composants 2- Swing, ses containers, ses composants les plus simples 3- Les gestionnaires de géométrie en Java 4- Gestion des événements en Java 5- Le MVC : Modèle Vue Controleur 6- Le MVC dans Swing, JTree, JList, JTable Bibliographie : java.sun.com (API et tutoriaux) Interfaces graphiques en Java 1 Les interfaces graphiques en Java Les programmes à interfaces graphiques font usage des classes awt (package java.awt) et/ou swing (package javax.swing). Ces classes représentent des composants graphiques, des conteneurs de composants, des utilitaires de placement des composants dans les conteneurs et des classes d’interaction utilisant le modèle d’événement Java Interfaces graphiques en Java 2 Généralités sur AWT (1/2) Historiquement, AWT (Abstract Window Toolkit) est la première API graphique de Java (version 1.0 du JDK). AWT utilise au maximum le système graphique sous-jacent, via la machine virtuelle Java qui fait appel au système graphique natif (MS windows, X Windows, Mac OS X, ...). package java.awt; public class Button{ Composant Bouton de MS Windows ... } Interfaces graphiques en Java 3 Généralités sur AWT (2/2) Avantages : l’aspect et le comportement des applications graphiques est conforme à ceux des autres applications qui tournent sur le même OS l’application bénéficie de l’efficacité, en terme de rapidité, des composants graphiques natifs pas besoin de réimplémenter tout les composants Inconvénients : ne permet de fournir que les composants graphiques disponibles pour toutes les plateformes impossibilité de garantir une uniformité des comportements et des apparences d’une même application d’un OS à l’autre Interfaces graphiques en Java 4 Généralités sur Swing (1/2) Swing est une extension de AWT, et existe depuis le JDK 1.2. JFC (Java Fundation Classes) = Java2D + copier/coller entre applications + Swing Swing a adopté l’approche inverse : faire le moins possible appel aux composants graphiques de l’OS, et uniquement pour des opérations de base (ouvrir une fenêtre, dessiner une ligne ou du texte, gérer les événements). package java.awt; public class JButton{ dessin de lignes sous MS Windows ... public void paint(){ ... } } Interfaces graphiques en Java 5 Généralités sur Swing (2/2) Avantages : Apparence et comportement indépendants des plateformes (Look and Feel) Possibilités d’introduire de nouveaux composants pour toutes les plateformes (Swing est bien plus riche qu’AWT) Inconvénients : Besoin de réimplémenter les composants existants dans les OS Les applications n’ont pas forcément les mêmes apparences et comportements que les autres applications de l’OS Les applications sont moins rapides (?) Interfaces graphiques en Java 6 Les classes AWT Interfaces graphiques en Java 7 Les conteneurs AWT Container classe générale qui regroupe des composants, responsable du layout Window conteneur pour interaction avec le système Frame fenêtre principale d'application Dialog fenêtre d’interaction avec l’utilisateur Panel conteneur de base Applet pour exécution dans un navigateur (package applet) ScrollPane intègre un conteneur d'ascenseurs Interfaces graphiques en Java Component Container Window Frame Dialog FileDialog Panel applet.Applet ScrollPane 8 Utilisation des containers public class ContainerTest extends Frame { public ContainerTest(){ super("ContainerTest"); Panel p = new Panel(); p.setBackground(Color.YELLOW); this.add(p); this.setSize(300,200); this.setVisible(true); p.getGraphics().drawString("Bonjour le monde!!", 50,50); } ContainerTest } public ContainerTestBis(){ super("ContainerTestBis"); this.setBackground(Color.YELLOW); this.setSize(300,200); this.setVisible(true); Dialog d = new Dialog(this,"Dialoguer avec moi",true); d.setSize(100,50); d.setResizable(false); d.setVisible(true); } ContainerTestBis public void paint(Graphics g){ g.drawString("Bonjour le monde!!", 50,50); } Interfaces graphiques en Java 9 Applet Applet est un Panel spécialisé. Une instance de Applet est incorporée dans un conteneur pour exécution. Une instance de Applet n'est donc pas une application autonome. Elle peut être incluse dans une page Web. Elle récupère les paramètres de la balise <PARAM... du code HTML via la méthode getParameter(String) Interfaces graphiques en Java <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>] [< ... >] </APPLET> 10 Cycle de vie de Applet Une instance de Applet est active ou inactive : au chargement, inactive au premier affichage, devient active selon le contexte, devient inactive • si elle sort de la partie visible de la page • si une autre page est activée Méthodes de gestion init() création, inactive start() mise en route, activation stop() arrêt, désactivation destroy() quand on quitte le programme. Une instance de Applet est exécutée dans un navigateur Web avec certaines restrictions (lecture/écriture/exécution sur le disque local, connection à d'autre machine que sa machine d'origine, ...) Interfaces graphiques en Java 11 Les composants AWT (1/2) Canvas pour le dessin, Choices est un menu déroulant, CheckboxGroup composant logique de regroupement de cases à cocher, TextArea propose plusieurs lignes alors que TextField n’en propose qu’une MenuBar Label TextField Choice List Checkbox Object Component Canvas TextComponent TextField TextArea List Label Button Choice Scrollbar Checkbox CheckboxGroup Button Interfaces graphiques en Java 12 Les composants AWT (2/2) Comportements communs à tous les composants : activation/désactivation du composant (réaction ou non aux actions de l’utilisateur) : setEnabled(boolean) et isEnabled() visibilité/invisibilité du composant : setVisible(boolean) et isVisible() font du composant : setFont(java.awt.Font) apparence du curseur sur le composant : setCursor(java.awt.Cursor) couleur de fond : setBackground(java.awt.Color) couleur de travail : setForeground(java.awt.Color) et bien d’autres ... Interfaces graphiques en Java 13 Les menus d’AWT MenuComponent est abstraite, Menu est une sous-classe de MenuItem par le design pattern des conteneurs Object MenuComponent MenuBar MenuBar mb = new MenuBar(); Menu m1 = new Menu("Languages"); Menu procedural = new Menu("Procedural"); procedural.add(new MenuItem("C")); procedural.add(new MenuItem("Pascal")); Menu objectOriented = new Menu("Object Oriented"); objectOriented.add(new MenuItem("Smalltalk")); objectOriented.add(new MenuItem("Java",new MenuShortcut(KeyEvent.VK_F10))); objectOriented.add(new MenuItem("Eiffel")); objectOriented.add(new MenuItem("C++")); Menu functional = new Menu("Functionnal"); functional.add(new MenuItem("Caml")); functional.add(new MenuItem("LISP")); m1.add(procedural); m1.add(objectOriented); m1.add(functional); mb.add(m1); this.setMenuBar(mb); Interfaces graphiques en Java MenuItem CheckboxMenuItem Menu PopupMenu MenuShortcut MenuTest 14 Les classes Swing (1/2) Les classes similaires à AWT réimplémentent les composants AWT ajoutent de nouveaux composants dérivés des composants AWT implémente le MVC (modèle, vue, contrôle) Interfaces graphiques en Java 15 Les classes Swing (2/2) Les classes nouvelles des types de Panel nouveaux pour davantage structurer les conteneurs des conteneurs particuliers bien utile (JToolBar, JProgressBar, ...) des conteneurs généraux « lourds » : JFrame, JWindow, JApplet, JDialog Interfaces graphiques en Java 16 JFrame (1/2) Une JFrame est la classe de base pour une application graphique Une JFrame contient une instance de la classe JRootPane Le Root Pane contient deux conteneurs, glassPane (JPanel) et layeredPane (JLayeredPane) La layeredPane contient deux conteneurs, contentPane (Container) et menuBar (null ou JMenuBar) On travaille dans contentPane par la méthode getContentPane() JApplet, JWindow et JDialog sont semblables. Interfaces graphiques en Java 17 JFrame (2/2) Une JFrame n'est par défaut pas affichée, il est nécessaire de la rendre visible par setVisible(boolean) Par défaut, si on ferme la fenêtre, elle devient invisible mais n'est pas détruite. La méthode dispose() libère les ressources utilisées par JFrame en détruisant l'objet et ce qu'elle référence. Possibilité de spécifier le comportement à la clôture de la fenêtre par la méthode setDefaultCloseOperation(int) les opérations étant DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, EXIT_ON_CLOSE JFrame offre des méthodes de dimensionnement et de placement : setLocation, setSize, setResizable Interfaces graphiques en Java 18 Les couches de JFrame : JRootPane Le seul composant direct de JWindow, JDialog, JFrame, JApplet et JInternalFrame Un JRootPane a deux parties terminales : glassPane et contentPane. menuBar est optionnel. layeredPane gère la géométrie des composants de contentPane et menuBar Le glassPane (de type JPanel) sert à capter des évènements souris. Les composants sont ajoutés via le contentPane : frame.getContentPane().add(child); Interfaces graphiques en Java 19 Les couches de JFrame : JLayeredPane Conteneur général pour des composants en couche. On peut donner des valeurs de niveau aux composants indiquant qui est affiché au dessus. Classe mère de JDesktopPane. La profondeur d’une couche est représenté par un objet Integer. Six profondeurs prédéfinies : FRAME_CONTENT_LAYER (-30000): le contentPane est de ce niveau DEFAULT_LAYER (0): niveau “par défaut” PALETTE_LAYER (100): pour les palettes, boîtes à outils déplaçables MODAL_LAYER (200): pour les dialogues modaux POPUP_LAYER (300): pour les menus glissants, les tooltips DRAG_LAYER (400): pour le glisser-déposer L’affichage est évidemment en ordre croissant Interfaces graphiques en Java 20 Barres d’outils en Swing JToolBar est un conteneur général, qui se redimensionne et peut être déplacé. Il contient classiquement des boutons groupés horizontalement ou verticalement. Il utilise un BoxLayout (horizontal par défaut). Les composants d'une barre d'outils sont a priori des boutons (mais potentiellement tout type de composant) JToolBar jtb = new JToolBar(); jtb.setFloatable(true); jtb.setRollover(true); jtb.add(new JButton("New")); jtb.add(new JButton("Open")); jtb.addSeparator(); Icon ic = new ImageIcon("java.gif"); jtb.add(new JButton("Java",ic)); jtb.add(new JRadioButtonMenuItem ("ON/OFF")); this.getContentPane().add(jtb, BorderLayout.PAGE_START); JToolBarTest Interfaces graphiques en Java 21 Menus en Swing Un menu a des entrées qui sont JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem, JSeparator, et JMenu. JMenuBar jmb = new JMenuBar(); JMenu file = new JMenu ("File"); file.add(new JMenuItem ("New")); file.add(new JMenuItem ("Open")); file.addSeparator(); file.add(new JMenuItem ("Close")); jmb.add(file); .... this.setJMenuBar(jmb); JMenuTest JPopupMenu sert pour les menus dynamiques (clic droit) Interfaces graphiques en Java 22 Autres conteneurs Swing JPanel est un conteneur très général, dérive immédiatement de JComponent, est opaque (important pour les dessins), doublement bufferisé (améliore la fluidité de l’affichage) JDesktopPane est un conteneur pour gérer des JInternalFrame Le JTabbedPane est un conteneur à navigation par onglets Le JScrollPane intègre des ascenceurs et permet de n’afficher qu’une partie d’une zone Le JSplitPane introduit un volet mobile entre deux composants Interfaces graphiques en Java 23 JInternalFrame JInternalFrame est une frame qui apparait à l'intérieur d'un composant. Le plus souvent, on l'ajoute au DesktopPane d'une JFrame. public class JInternalFrameTest extends JFrame{ public JInternalFrameTest(){ super("JInternalFrameTest"); JInternalFrame intern = new JInternalFrame("Fenêtre interne"); intern.getContentPane().add(new JLabel("Je suis une fenêtre interne")); intern.setVisible(true); intern.setSize(200,300); intern.setResizable(true); intern.setIconifiable(true); intern.setMaximizable(true); JDesktopPane desk = new J DesktopPane(); desk.add(intern); this.setContentPane(desk); this.setSize(400,600); this.setVisible(true); } JInternalFrameTest } Interfaces graphiques en Java 24 JTabbedPane public class JTabbedPaneTest extends JFrame{ public JTabbedPaneTest() { super("JTabbedPaneTest"); String tabs[] = {"C++", "Java", "Eiffel", SmallTalk"}; JTabbedPane tabbedPane = new JTabbedPane(); this.setLayout (new BorderLayout()); for (int i=0;i<tabs.length;i++){ JPanel p = new JPanel(); p.add(new JLabel("Panel "+(i+1))); tabbedPane.addTab (tabs[i], null, p); } tabbedPane.setSelectedIndex(0); tabbedPane.setMnemonicAt(2,KeyEvent.VK_E); tabbedPane.setIconAt(1,new ImageIcon("java.gif")); this.getContentPane().add(tabbedPane,BorderLayout.CENTER); this.setSize(200,400); this.setVisible(true); } public static void main(String[] args){ new JTabbedPaneTest(); } JTabbedPaneTest } Interfaces graphiques en Java 25 JScrollPane Gère automatiquement des ascenseurs autour de son composant central qui est un JViewPort. public class JScrollPaneTest extends JFrame{ public JScrollPaneTest() { super("JScrollPaneTest"); JLabel comp = new JLabel(new ImageIcon("Madagascar.JPG")); JScrollPane scrollPane = new JScrollPane(comp); this.getContentPane().add (scrollPane); this.setSize(200,400); this.setVisible(true); } public static void main(String[] args){ new JScrollPaneTest(); } } JScrollPaneTest Interfaces graphiques en Java 26 JSplitPane Panneau à compartiments, chaque compartiment est ajustable Panneau à séparation verticale ou horizontale JLabel mad = new JLabel(new ImageIcon("Madagascar.JPG")); JScrollPane scrollPane = new JScrollPane(mad); JLabel one = new JLabel("Panel ONE"); JLabel two = new JLabel("Panel TWO"); JSplitPane right = new JSplitPane(JSplitPane.VERTICAL_SPLIT,one,two); right.setDividerSize(20); right.setDividerLocation(0.1); JSplitPane left = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,new JScrollPane(mad),right); left.setOneTouchExpandable(true); this.getContentPane().add(left); JSplitPaneTest Interfaces graphiques en Java 27 Les composants Swing (1/3) Comportements ajoutés à Component : gestion d’une bulle d’aide : setToolTipText(String) gestion de l’opacité : setOpaque(boolean) et isOpaque() Container JComponent Window AbstractButton JToggleButton Dialog JCheckBox JDialog JRadioButton JButton JLabel JTree JToolTip JFileChooser JSpinner JColorChooser JSlider JComboBox JTable JInternalFrame JList JProgressBar JOptionPane Interfaces graphiques en Java 28 Les composants Swing (2/3) Interfaces graphiques en Java 29 Les composants Swing (3/3) Interfaces graphiques en Java 30 Les composants texte Ils dérivent de JTextComponent : JTextField permet d'afficher une ligne de texte, éditable ou non JPasswordField permet la saisie d'une ligne de texte en affichant des étoiles JTextArea permet d'afficher un texte multi-lignes dans un style donné JEditorPane et JTextPane permettent d'afficher du texte en modes texte, HTML ou RTF, à partir de fichiers sources. Le style du texte peut ne pas être uniforme Interfaces graphiques en Java 31 ButtonGroup Une instance de ButtonGroup permet de grouper des boutons (AbstractButton qui regroupe JButton,JCheckBox, JRadioButton, et les équivalents en JMenuItem) de façon à ce qu'un seul soit sélectionné. Un ButtonGroup n'est pas un composant, les boutons doivent être ajoutés dans un container. ButtonGroup bg = new ButtonGroup(); JRadioButton oui = new JRadioButton("OUI"); bg.add(oui); JRadioButton non = new JRadioButton("NON"); bg.add(non); JCheckBox pe = new JCheckBox("PEUT ETRE"); bg.add(pe); JToolBar jtb = new JToolBar(); jtb.setFloatable(true); jtb.setRollover(true); jtb.add(oui); jtb.add(non); jtb.add(pe); this.getContentPane().add(jtb, BorderLayout.PAGE_START); Interfaces graphiques en Java ButtonGroupTest 32 JToolTip JToolTip sert à ajouter des bulles d'aide sur les composants. On peut créer ses propres formats de bulles d'aide en subclassant JToolTip et en redéfinissant la méthode setToolTipText de JComponent Button b = new Button("bouton"); b.setToolTipText("je suis un bouton"); TooTipTest Interfaces graphiques en Java 33