470 likes | 581 Views
Jean-Rémi LECQ Version 0.3. Développement d’interfaces graphiques en Java à l’aide de SWING. Sommaire. Introduction Rappel sur les JFC AWT Swing Première Application (TD1) Fenêtres, panneaux Fenêtres : JFrame, JDialog, JWindow Panneaux : JRootPane, J Panel, JMenuBar PremierJMenu (TD2)
E N D
Jean-Rémi LECQVersion 0.3 Développement d’interfaces graphiques en Java à l’aide de SWING
Sommaire • Introduction • Rappel sur les JFC • AWT • Swing • Première Application (TD1) • Fenêtres, panneaux • Fenêtres : JFrame, JDialog, JWindow • Panneaux : JRootPane, J Panel, JMenuBar • PremierJMenu (TD2) • Les évènements • PremierJMenu (TD2 – suite) + SecondJMenu +FocusEvent
Rappel sur les JFC JFC = Java Foundation Classes. Ensemble de librairies Java permettant la constructions d’applications graphiques (GUI et graphiques) sous n’importe quel OS. Les 5 parties majeures des JFC :AWT – SWING – Accessibility - Java2D - Internationalization
1- Contexte D’abord… AWT : Abstract Windowing Toolkit.Première librairie fournie par SUN pour le développement d’interfaces graphiques.Eléments graphiques auront l’apparence que l’OS leur donne (utilisation ressources systèmes via abstractions) !
1- Contexte Ensuite … SWING : utilise des éléments d’AWT.SWING peut être considérée comme une évolution d’AWT.Eléments graphiques dessinés par la librairie elle-même ! Composant graphique peut ne pas avoir d’équivalent système.Donc -> Portabilité accrue.SWING ne remplace pas AWT, c’est juste un couche au dessus.
2- TD n°1 Première application SWING Ordre des tâches à effectuer ; • Ecriture du code de la classe, • Compilation (javac.exe) et debugage (?), • Création du Manifest, • Création de l’archive auto exécutable (jar.exe), • Exécution de notre archive auto exécutable (java.exe)
2.1- Ecriture du code de la classe import javax.swing.*; publicclass PremiereApp { privatestatic String texte = "Hello World!"; publicstaticvoid main(String[ ] args) { JFrame maFenetre = new JFrame( "ma première fenêtre SWING"); maFenetre.setSize(250,80); JLabel monLabel = new JLabel(texte, SwingConstants.LEFT); maFenetre.getContentPane().add(monLabel); maFenetre.show(); maFenetre.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); } }
2.2- Compilation (javac.exe) et debugage • Sous Eclipse ou autre Framework -> automatique. • En ligne de commande -> positionnez vous dans le répertoire qui contient votre classe java, puis : "/pathtojavac.exe/javac" MaClass.java
2.3 - Création du Manifest • Manifest -> Qu'est ce que c'est ? C'est un fichier qui spécifie la classe "exécutable".Celle qui contient la méthode ??? public static void main (String[ ] args){ … }
2.3 - Création du Manifest Créez un fichier Manifest.mf. Contenu : Main-Class: MaClass Attention :- Pas d'espace entre "Main-Class" et ":",- un espace entre ":" et "MaClass",- (au moins) un retour à la ligne à la fin de cette ligne !
2.4 - Création de l’archive auto exécutable (jar.exe) Sous Eclipse ou autre Framework -> automatique. En ligne de commande -> positionnez vous dans le répertoire qui contient votre classe java, puis : "/pathtojarexe/jar" -cmf Manifest.mf NomduJar.jar MaClass1.class MaClass2.class Pour notre exemple : "/pathtojar.exe/jar" -cmf Manifest.mf PremiereApp.jar PremiereApp.class Sur moka : U:/pathtojar.exe/> "C:\Program Files\java\j2sdk1.4.1_02\bin\jar" -cmf manifest.mf PremiereApp.jar PremiereApp.class
2.5- Exécution de notre archive auto exécutable (java.exe) En mode "fenêtre" : double clic sur l'archive auto exécutable "MonArchive.jar". En mode console : "/pathtojava.exe/java" -jar MonArchive.jar
2.6- Listing du contenu d'un jar • En mode console : jar –tvf MonArchive.jar
3 – Fenêtres, panneaux et bordures 3.1- FENETRES En SWING : • JFrame, • JDialog (fenêtres secondaires modales), • JWindow (Splash screen).
3.1.1- JFrame - Architecture JFrame JRootPane glassPane layeredPane ( JLayeredPane) (1 Jpannel par défaut) contentPane menuBar (1 JPannel par défaut) (Null JmenuBar par défaut)
menuBar glassPane layeredPane contentPane 3.1.1- JFrame - Architecture
3.2 – Les panneaux Conteneurs • JRootPane. • glassPane (attrape événements). • layeredPane (conteneur de fenêtres filles), • contentPane (JPanel par défaut). • menuBar (null par défaut). • JPanel : conteneur de composant(s), leur organisation dépend d'un "layour manager". • JMenuBar : "null", sinon unique par JFrame. • JLayeredPanel : construction de fenêtres fille (MDI)
Créer la fenêtre suivante (l'affichage seulement, les évènements seront ajoutés après). 3- TD n°2 Premier JMenu
3.2.5- La gestion des évènements • Evènement : action de l'utilisateur (en règle générale), clic sur un bouton; sélection, simple déplacement souris. • Exemples de classes d’évènements : FocusEvent : Passage du focus à un composant MouseEvent : Clic sur un JPanel ActionEvent : Clic sur un JButton DocumentEvent : Ajout d’une lettre à un JTextField • Objet évènement contient des informations sur son contexte d'apparition(coordonnée, source, valeur d'une touche).
3.2.5- La gestion des évènements • Classe java.util.EventObject :Superclasse de tous les évènements. • Exemple de classe d'évènements : ActionEvent -> clic sur un composant, ComponentEvent -> modification d'un composant ContainerEvent -> composant ajouté à un conteneur FocusEvent KeyEvent MouseEvent
Abonnement addActionListener, addKeyListener, addFocusListener Listener Bouton Notification 3.2.5- La gestion des évènements • Listener : objet java à l'écoute d'un évènement sur un composant déterminé.-info sur lui-même,-sur l'objet à son origine (source).
3.2.5- La gestion des évènements • Listener = classe qui implémente une des interfaces de java.awt.Event (à importer). • Méthodes à redéfinir (cf. cours) • Exemple : public class PremierMenu extends JFrame implements ActionListener { public void actionPerformed(ActionEvent e) { … } }
TD n°2 Premier JMenu (suite) • Ajout des évènements TD Second Menu TD FocusEvent
TD FocusEventaide • Construction d'une classe implémentant l'interface "listener " gérant les focus. • Redéfinir les méthodes nécessaires. • Créer un constructeur qui initalise deux couleurs. • Construction d'une classe étendant JFrame. • Celle-ci doit contenir 3 javax.swing.JButton • JFrame.getContentPane(Object, BorderLayout.North) • Color JFrame.setBackground() / getBackground() • java.awt.Color -> Color.GREEN
TD KeyEvent • But : Coder la JFrame suivante : • Comportement : A chaque pressiond'une touche, le caractère correspondantest ajouter à la barre de titre. • Attention :bien différencier "getKeyChar()"et getKeyCode()
TD KeyEventaide • Définir une classe étendant JFrame avec un simple JLabel dont vous déterminer une bordure de votre choix (utilisez la méthode setBorder()) de la façon la plus "rapide" possible (cf. cours). • Définir une classe étendant le Listener de votre choix, dans laquelle vous définirez la construction d'une barre de menus et les évènements associés aux clic sur chacun de ses MenuItems
3.3- Les bordures • Bordures SWING prédéfinies : • BevelBorder : Bordure 3D (élevée / abaissée) • TitledBorder : Bordure avec titre. • EtchedBorder : Bordure à l’apparence gravée. • CompoundBorder : Combinaison de bordures interne et externe. • EmptyBorder : Bordure transparente délimitant des espaces vides. • LineBorder : Bordure aplatie. • MatteBorder : Bordure pleine (couleur) ou en mosaïque (images). • SoftBevelBorder : Bordure 3D avec côtés arrondis. • BorderFactory
3.3- Les bordures • TD3 PremiereBordure
3.3- Les bordures • Possibilité de développer ses propres éléments graphiques dont les bordures font partie ! • Une façon de faire : • Commencez par définir la classe implémentant Border. Attention, 3 methodes à redéfinir : • public Insets getBorderInsets(Component c) { } • public boolean isBorderOpaque() { return true; } • public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { } : méthode qui affiche la bordure avec la taille et la position spécifiées. Utiliser les méthodes adéquates de g (ex: setColor(), drawLine(), drawArc()). • Ensuite définissez une JFrame. Appliquer votre bordure par l'intermédiaire d'un objet de CompoundBorder: • CompoundBorder Mabord = new CompoundBorder(new EmptyBorder(10,10,10,10), new BordurePerso (10,10,Color.X,Color.Y));
3.3- Les bordures • TD3 BordurePersonnalisee
4 – Libellés et boutons 4.1 - JLabel • Label contenant du texte : alignement à gauche • Label contenant une image : alignement au centre • Possibilité de spécifier son alignement personnel : • setVertical[Text]Alignement(int alignement) • setHorizontal[Text]Alignement(int alignement) • - SwingConstants.LEFT • - SwingConstants.CENTER • - SwingConstants.RIGHT • - SwingConstants.TOP • - SwingConstants.BOTTOM
4 – Libellés et boutons 4.2 - Bouton • classe javax.swing.AbstractButton • boutons poussoirs(JButton), • boutons bascule (JToggleButton), • cases à cocher (JCheckBox), • boutons radio (JRadioButton), • mais aussi les élements de menu (JMenuItem) et les menus eux-mêmes (JMenu)
4.2 - Bouton 4.2.1 - boutons poussoirs(JButton) : • Texte, image (neutre, survol, clic), raccourci vers le bouton (setMnemomic(char)-> Alt+"char") • JRootPane.setDefaultbutton(Button) -> focus
4.2 - Bouton 4.2.2 - boutons bascule (JToggleButton): • javax.swing.JToggleButton • JCheckBox et JRadioButton -> principe d'exclusion mutuelle. • ButtonGroup.add( Button )
TD 4 - Boutons Bascules et ActionListeners • 1 JButton • 3 JToggleButton • 1 ButtonGroup • 1 JLabel • 1JPanel les contenant tous (FlowLayout par défaut)
4 – Layouts • Définition : • Lorsqu'un "container" contient plusieurs composants, un layout est implémenté afin de gérer correctement le positionnement de chacun d'eux. • Composant.size() != Composant.preferredSize() • Liste : • FlowLayout • GridLayout • BoxLayout • BorderLayout
4 – Layouts 5.1.1 classe java.awt.FlowLayout • Les composants sont placés : • les uns à côté des autres de gauche à droite • sur une seule ligne tant que c'est possible • ajout de ligne si nécessaire • impossible de connaître la ligne du composant à l'avance • Layout par défaut des JPanel (sauf le JRootPane -> BorderLayout) • FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER
4 – Layouts 5.1.2 classe java.awt.GridLayout import java.awt.*; import java.applet.Applet; public class ButtonGrid extends Applet { public void init() { setLayout(new GridLayout(3,2)); add(new Button("1")); add(new Button("2")); add(new Button("3")); add(new Button("4")); add(new Button("5")); add(new Button("6")); } } • Applique la .preferredSize() -> réajustement non souhaité ?
4 – Layouts 5.1.3 java.swing.BoxLayout • C'est un FlowLayout qui peut être soit horizontal soit vertical, en fonction des paramètres donnés au constructeur : BoxLayout(Container target, int axis) • Composant affichés selon leur "preferredSize" et ne sont pas redimensionnés !
4 – Layouts 5.1.3 java.swing.BoxLayout • java.swing.Box • Structures solides : espace fixe entre 2 composants • Box. createHorizontalStrut(int width) • Box. createVerticalStrut(int height) • Glues : composants qui occupe le + d'espace possible horizontalement ou verticalement. • Box. createHorizontalGlue() • Box. createVerticalGlue() • Zones rigides : composant invisible de taille fixe • Box. createRigidArea(Dimension d)
4 – Layouts NORD (NORTH) OUEST (WEST) CENTRE (CENTER) EST (EAST) SUD (SOUTH) 5.1.4 java.swing.BorderLayout • Stratégie de positionnement en 5 cases : • Zone centrale -> max H et max V • Z. Nord et Sud -> max H et min V • Z. Est et Ouest -> min H et max V
6 – Combo Box 6.1 java.swing.JComboBox JComboBox = JList + bouton 6.1.1 TD6 ComboBox pour choix de films (cf. cours)
6 – Combo Box Comment dois je dessiner la ligne ? ( envoi de l’objet ) Combo Box Objet Renderer Renvoie le composant graphique entièrement paramétré JLabel 6.1.2.1 Les Renderers • Objet simple permettant de dessiner des composants complexes • Exemple : ComboBox (chaque ligne = 1 JLabel)
6 – Combo Box Interface ListCellRenderer Interface TableCellRenderer Interface TreeCellRenderer DefaultListCellRenderer DefaultTableCellRenderer DefaultTreeCellRenderer 6.1.2.1 Les Renderers 6.1.2 TD6 ComboBox personnalisée (cf. cours)
7 - JList 7.1 Sélection