Intro – Développement Interface Graphique (Swing) Un premier tour d’horizon Composant Graphique, Layout, Event PROJET DE LICENCE : INTERFACE GRAPHIQUE (1) JAVA.AWT ET JAVAX.SWING awt =1ère boite à outil de java Éléments de base Component (et Graphics) Container Layout (LayoutManager) swing = extension (d’abord JFC puis intégrer depuis jdk 1.2) swing : faire que tout fonctionne de manière identique partout Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 2 / 113 JAVA.AWT.COMPONENT Élément de base Définit un élément graphique (qui sera affiché dans…) avec des propriétés (et des getters / setters) Une Size (class Dimension avec .width et .height) Une Location (Position) (class Point avec .x et .y) (0,0) Coordonnées x Origine au coin supérieur gauche x (width) vers la droite et y (height) vers le bas y Visible (boolean) ; Opaque (boolean) Une couleur de fond (background) et une couleur d’écriture (foreground) Etc. Méthode public void paint(Graphics g) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 3 / 113 JAVA.AWT.GRAPHICS Contexte graphique (« morceau d’écran ») Permet de dessiner Changer de crayon : setColor drawRect, drawOval, drawPolygon, drawString, fillRect, fillOval drawImage(img, x, y, ImageObserver) Obtenu automatiquement (repaint(), redimensionnement, etc.) Grapgics2D : vue plus « complète » Transformation géométrique (translate, rotate) Effets graphiques g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setStroke(new BasicStroke(epaisseur)); Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 4 / 113 JAVA.AWT.COLOR Couleur additive 4 octets (0-255) Rouge (getRed) Vert (getGreen) Bleu (getBlue) Transparence (getAlpha) .darker() ; .brighter() Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 5 / 113 JAVA.AWT.CONTAINER Component Hérite de Component Containter Pattern Composite Porte d’autres Component (y compris des Container) Organisation LayoutManager add / remove d’un Component Différent type d’add, en fonction du Layout getComponents retourne un tableau de tous ceux inclus Unicité de lieu (un add ailleurs => déplacement) Indice des components Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 6 / 113 LAYOUTMANAGER Définit l’organisation Basé sur une des tailles (preferred, minum, maximum) ou une maximisation de l’élément BorderLayout par défaut dans une fenêtre ajout en précisant la zone add("North" , comp) FlowLayout : en ligne GridLayout : en tableau GridBagLayout : avec des contraintes etc. Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 7 / 113 APERÇU DU BOXLAYOUT Organisation Alignement des bords : container.add(Box.createVerticalGlue()); ligne.add(Box.createHorizontalGlue()); Insertion de “blancs” pour combler setAlignmentX(Component.LEFT_ALIGNMENT); pour aligner les bords gauches Insertion de « blancs » pour remplir (séparation) Vertical : container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS)); Horizontal : ligne. setLayout(new BoxLayout(ligne, BoxLayout.LINE_AXIS)); Généralement basé sur la taille maximum (dépend du component) zoneOutils.add(Box.createVerticalBox()); Insertion de « blancs » pour espacer… container.add(Box.createRigidArea(new Dimension(5,5))); Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 8 / 113 SANS LAYOUT setLayout(null) Pas d’intelligence au placement / dimensionnement Chaque component doit Avoir une taille (setSize) Avoir une position (setLocation) Positionnement au pixel… Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 9 / 113 EXEMPLE DE LAYOUT Fenêtre en BorderLayout Colonne (Jpanel) en BoxLayout Un JPanel sans Layout (Layout null) Sous élément en BoxLayout Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 10 / 113 ARBRE DE COMPOSANTS GRAPHIQUES 1 fenêtre 2 contentPane « Center » « West » zoneDessin zoneOutils 3 4 5 1 Ellipse Ellipse Rectangle Rectangle Rectangle Bouton « Aucune » Bouton « Rectangle » Bouton « Ellipse » Université Nice Sophia Antipolis 2 3 ... L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 11 / 113 MÉTHODES À CONNAÎTRE repaint() ! validate() ! setEnabled(true / false) : activé / désactivé (Rectangle) getBounds / setBounds(x,y, w, h) : positionne et dimensionne getWidth() : largeur / getHeight() : hauteur getX() et getY() : obtenir une coordonnée setVisible(true / false) getBackground et setBackground [objet Color, définition RGB] Certaines sont de JComponent… Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 12 / 113 basé sur un transparent d’Audrey Occello FENÊTRE : CONTAINER DE HAUT NIVEAU JFrame (Frame, Window Container) getRootPane () zone de la fenêtre sous le titre getLayeredPane() zone où sont cachés les panneaux non visibles getContentPane () zone où les éléments sont ajoutés getGlassPane () zone transparente dessinée au-dessus du JRootPane utilisé pour afficher des pop-up menus Université Nice Sophia Antipolis Forward de méthode sur le contentPane contentPane avec un BorderLayout par défaut L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 13 / 113 JFRAME : QUELQUES MÉTHODES setVisible( boolean ) Une position sur l’écran Besoin d’une taille Méthode pack( ) : calcul de la taille optimale (basée sur les layouts) WindowListener ou setDefaultCloseOperation Par défaut, fermer la fenêtre revient à la cacher Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 14 / 113 basé sur un transparent d’Audrey Occello APERÇU DE JAVAX.SWING JCOMPONENT Hérite de Container Méthodes de commodité setPreferredSize, setMaximumSize, setMinimumSize setDoubleBuffered(true/false) / isDoubleBuffered() setOpaque(true / false) Dessin à l’écran : paint appel paintComponent paintBorder paintChildren Surcharge en général de paintComponent, appel au super Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 16 / 113 JCOMPONENT ET BORDER setBorder(Border border) BorderFactory pour obtenir les bords existants Pattern Factory CompoundBorder createDashedBorder createEmptyBorder createEtchedBorder createLineBorder createMatteBorder Etc. http://docs.oracle.com/javase/7/docs/api/javax/swing/Bor derFactory.html Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 17 / 113 PETITES LISTES DES JCOMPONENTS les boutons Les îcones : javax.swing.ImageIcon créer avec le nom d’un fichier image par exemple Les champs textuels JButton /JToggleButton / JCheckBox / JRadioButton java.awt.ButtonGroup (méthode add) JTextField/ JTextArea Menus : les JMenuBar, JMenu, JMenuItem Etc… http://java.sun.com/docs/books/tutorial/uiswing/ Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 18 / 113 SWING : OBJET DE HAUT NIVEAU JColorChooser Jdialog Pattern Factory pour obtenir .JColorChooser.showDialog(Component élément de référence, String message du choix, Color couleur initiale) Pattern Factory pour obtenir le type de dialogue Exemple : String name = JOptionPane.showInputDialog("entrez le nom de l'image (format png)"); JTable etc. Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 19 / 113 HÉRITAGE OU UTILISATION Choix à faire Cas de la JFrame par exemple : extends Champs de classe Extension de la boite à outils « Petites » modifications Graphiques Ou comportementales Objet qui n’existe pas Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 20 / 113 ÉVÉNEMENTS (1/2) Chaque élément graphique subit des événements Principe du CallBack Interface pour l’écouteur add et remove pour l’écouté Appel aux écouteurs par l’écouté lorsque l’événement se produit Parcours des composants à l’écran du dessus vers le dessous) jusqu’au premier « écoutable » Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 21 / 113 ÉVÉNEMENTS (2/2) processEvent : transmettre un événement Même processus que pour l’affichage Les objets Event package java.awt.event et javax.swing.event getSource() : savoir d’où il vient Spécialisés : MouseEvent, ActionEvent, etc. Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 22 / 113 EXEMPLE « LIVE » Réalisation d’une JFrame Ajout d’un bouton Ajout d’un ActionListener Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 23 / 113 Swing ; événement, classe interne PROJET DE LICENCE : INTERFACE GRAPHIQUE (2) Les événements et leurs utilisations en java ÉVÉNEMENTS ÉVÉNEMENTS Actions non séquentielles Principe du CallBack Interface pour l’écouteur add et remove pour l’écouté Appel aux écouteurs par l’écouté lorsque l’événement se produit Parcours des composants à l’écran du dessus vers le dessous) jusqu’au premier « écoutable » Les étapes : Besoin d’événement déclencheur Chaque élément graphique subit des événements Il se passe quelque chose sur un objet Ceux qui observent l’objet s’en rendent compte Ils réagissent Pas vraiment de l’observation, mais de l’abonnement… Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 26 / 113 PRINCIPE DES ÉVÉNEMENTS EN JAVA L’objet qui est source de l’événement méthode add<Truc>Listener (on peut s’abonner) Ceux qui observent implements <Truc>Listener ils sont ajoutés à la liste des oberservateurs (appel de add<Truc>Listener) Quand l’événément Truc se produit L’objet Université Nice Sophia Antipolis appelle tous ceux qui l’observe L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 27 / 113 1ER EXEMPLE : JAVA.AWT.EVENT.ACTIONLISTENER Pour réagir aux clics sur les boutons (par exemple) addActionListener java.awt.Button / java.awt.List / java.awt.MenuItem / java.awt.TextField / java.awt.TrayIcon / javax.swing.AbstractButton / javax.swing.ButtonModel / javax.swing.ComboBoxEditor / javax.swing.DefaultButtonModel / javax.swing.JComboBox / javax.swing.JFileChooser / javax.swing.JTextField / javax.swing.plaf.basic.BasicComboBoxEditor / javax.swing.Timer Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 28 / 113 JAVA.AWT.EVENT.ACTIONEVENT Constructeurs Méthodes spécifiques Object source, int id, String command Object source, int id, String command, int modifiers Object source, int id, String command, long when, int modifiers String int long String getActionCommand() getModifiers() getWhen() paramString() nom de l’action savoir si une touche est pressée quand ? Méthodes générales (ObjectEvent) Object Université Nice Sophia Antipolis getSource() objet à l’origine de l’événement L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 29 / 113 JAVA.AWT.EVENT.ACTIONLISTENER void actionPerformed(ActionEvent e) Appelé par l’objet source de l’action (sur lequel l’utilisateur a cliqué) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 30 / 113 UNE FENÊTRE ET 2 BOUTTONS : FENETRE2BOUTONS (1/2) // création d’une fenêtre JFrame f = new JFrame("2 boutons"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // création d’un panel (FlowLayout) comme contenu JPanel p = new JPanel(); // création de l’écouteur (c.f. plus loin) MonEcouteurDAction ecouteur = new MonEcouteurDAction(f); // un bouton JButton b = new JButton("un bouton"); b.setActionCommand("vous avez cliquez sur un bouton"); b.addActionListener(ecouteur); Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 31 / 113 UNE FENÊTRE ET 2 BOUTTONS : FENETRE2BOUTONS (2/2) // un menu déroulant JComboBox j = new JComboBox(); j.addItem("Bonjour"); j.addItem("Au revoir"); j.setActionCommand("vous avez choisi une option du menu d\u00e9roulant"); j.addActionListener(ecouteur); // on ajoute le tout dans la fenêtre qui devient visible p.add(b); p.add(j); f.setContentPane(p); f.pack(); f.setVisible(true); Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 32 / 113 UNE FENÊTRE ET 2 BOUTTONS : MONECOUTEURDACTION (1/2) implements ActionListener // un fenêtre nécessaire pour la popup de dialogue private JFrame parent ; // le constructeur public MonEcouteurDAction(JFrame fen) { parent = fen; } Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 33 33 / 113 UNE FENÊTRE ET 2 BOUTTONS : MONECOUTEURDACTION (2/2) // l’action est affichée (console ou popup) public void actionPerformed(ActionEvent e) { if (parent == null) { System.out.println("Action sur "+e.getSource()+" : "+e.getActionCommand()); } else { JOptionPane.showMessageDialog(parent, e.getActionCommand(), "Action", JOptionPane.INFORMATION_MESSAGE); } } Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 34 / 113 2IÈME EXEMPLE : JAVAX.SWING.EVENT.MOUSEINPUTLISTENER Pour écouter les événements liés à la souris Clic (mousePressed / mouseReleased / mouseClicked) Survol (mouseEntered / mouseExited) Déplacement (mouseMoved) Glisser/Drag (mouseDragged) Quasiment tout composant graphique Réunion de java.awt.event.MouseListener et de java.awt.event.MouseMotionListener Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 35 / 113 JAVA.AWT.EVENT.MOUSEEVENT Constructeurs Méthodes spécifiques Object source, int id, long when, int modifiers, int x, int y, int clickCount, boolean popupTrigger, int button Modifiers : masques qui permet de caractériser l’événement + 2 autres constructeurs int getButton() sur quel bouton de la souris int getClickCount() nombre de clic (double clic) Point getLocationOnScreen() position à l’écran Returns the absolute x, y position of the event. static String getMouseModifiersText(int modifiers) Point getPoint() position dans l’objet source int getX() abscisse dans l’objet source int getXOnScreen() int getY() int getYOnScreen() boolean isPopupTrigger() String paramString() void translatePoint(int x, int Méthodes générales (ObjectEvent) Object Université Nice Sophia Antipolis getSource() objet à l’origine de l’événement L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 36 36 / 113 EXEMPLE : GLISSER DÉPOSER (1/2) Point p; /* ** MouseListener : on mémorise le début du glisser */ public void mousePressed(MouseEvent e) { p = e.getPoint(); } public public public public void void void void mouseReleased(MouseEvent e) {} mouseClicked(MouseEvent e) {} mouseEntered(MouseEvent e) {} mouseExited(MouseEvent e) {} Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 37 / 113 EXEMPLE : GLISSER DÉPOSER (2/2) /* ** MouseMotionListener */ public void mouseDragged(MouseEvent e) { Point newP = e.getPoint(); source.setLocation(source.getX()+newP.x-p.x, source.getY()+newP.y-p.y); } public void mouseMoved(MouseEvent e) {}public Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin void 38 / 113 ÉVÉNEMENTS processEvent : retransmettre un événement Ou alors appeler directement les listeners Même processus que pour l’affichage Attention au blocage !! Les objets Event package java.awt.event et javax.swing.event getSource() : savoir d’où il vient Spécialisés : MouseEvent, ActionEvent, etc. Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 39 / 113 Des classes internes et anonymes Souvent utiliser avec les listeners INNER CLASS INNER CLASS Définition Dans une classe Dans une méthode, entre { } En paramètre (anonyme) Observable : ClassePrincipe.class ClassePrincipe$1NomInterne.class ClassePrincipe$2.class Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 41 / 113 INNER CLASS : POURQUOI ? Outil supplémentaire Héritage supplémentaire (sans être un objet du type) Masquage de l’implémentation (y compris au package) Définition de « callback » à la volée Utile pour la programmation événementielle Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 42 / 113 LIEN ENTRE L’INNER DANS UNE CLASSE ET L’OUTER L’inner a accès aux éléments de la classe qui l’inclus Accès à l’instance de la classe avec <NomDeClasse>.this Création d’une instance d’une inner classe <Instance de NomDeClasse>.new <Inner>( ) Ex : Bebete.Etat result = bebete.new Etat(); Bebete est une classe contenant une classe interne Etat ; bebete est une instance de la classe Bebete Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 43 / 113 INNER DANS UN BLOC D’INSTRUCTION Ne peuvent pas être utiliser en dehors de la méthode Utile pour personnaliser des objets sans créer de classe (masquer l’implémentation). import java.awt.Point; public class InnerMeth { Point getP(int x, int y) { class MyPoint extends Point { MyPoint(int x, int y) { super(); this.x = x; this.y = y; } public String toString() { return "ceci est un point différent "+super.toString(); } } return new MyPoint(x,y); } public static void main(String [] args) { InnerMeth i = new InnerMeth(); System.out.println(new Point(4, 10)); System.out.println(i.getP(4, 10)); } } Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 44 / 113 ANONYMOUS INNER CLASS Une classe sans nom, définit par un new <NomDeClasse>(…) { <du code> } On peut ainsi « étendre » n’importe classe classe, interface ou classe abstraite Si on a besoin d’une référence extérieure, il faut que l’élément soit « final » Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 45 / 113 Layout ; menu ; bouton Ressource (images) : http://docs.oracle.com/javase/tutorial/index.html PROJET DE LICENCE : INTERFACE GRAPHIQUE (3) Les différentes « mises en page » internes aux composants graphiques LAYOUT LAYOUTMANAGER Définit l’organisation Proche du pattern strategy Basé sur une des tailles (preferred, minum, maximum) ou une maximisation de l’élément BorderLayout par défaut dans une fenêtre ajout en précisant la zone add("North" , comp) North ou South : hauteur garantie (préférée) Center : redimensionne au reste East ou West : largeur garantie (préférée) 1 seul composant par emplacement Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 48 / 113 BOXLAYOUT Organisation Alignement des bords : colonne.add(Box.createVerticalGlue()); ligne.add(Box.createHorizontalGlue()); Insertion de “blancs” pour combler setAlignmentX(Component.LEFT_ALIGNMENT); pour aligner les bords gauches Sur les composants ajoutés Insertion de « blancs » pour remplir (séparation) Vertical : container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS)); Horizontal : ligne. setLayout(new BoxLayout(ligne, BoxLayout.LINE_AXIS)); Généralement basé sur la taille maximum (dépend du component) zoneOutils.add(Box.createVerticalBox()); Insertion de « blancs » pour espacer… container.add(Box.createRigidArea(new Dimension(5,5))); Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 49 / 113 SANS LAYOUT setLayout(null) Pas d’intelligence au placement / dimensionnement Chaque component doit Avoir une taille (setSize) Avoir une position (setLocation) Positionnement au pixel… Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 50 / 113 basé sur un transparent d’Audrey Occello FLOWLAYOUT Composants « alignés » sur une ligne Si cela ne tient pas on commence une nouvelle ligne Possibilité de spécifier l’alignement (centré par défaut) sur le layout : Paramètre du constructeur ou setAlignement(int) FlowLayout.LEFT ; RIGHT ; CENTER ; LEADING ; TRAILING Gestionnaire d’affichage par défaut des JPanel 51 Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 51 / 113 CARDLAYOUT Permet d’empiler des panneaux (= composants ) Association clef (String) / panneau Ajout dans le container : Méthode add( Component, "Une clef – chaine de caractère") Montrer un « panneau » (méthode de CardLayout) : Navigation : first(Container parent) ; last(Container parent) ; next(Container parent) ; previous(Container parent) Désignation : show(Container parent, String name) 52 Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 52 / 113 JTABBEDPANE JPanel avec CardLaout et intégration des boutons de navigation Méthodes : addTab (Nom, (Icône,) Component (, Tips) ) insertTab / removeTab setSelectedIndex / setSelectedComponent / get- Apparences setTabPlacement(int) avec JTabbedPane.TOP ; BOTTOM ; LEFT ou RIGHT Modification des boutons (setIconAt ; setBackgroundAt ; setEnabledAt ; etc.) setTabComponentAt : personnalisation des boutons indexOfTabComponent : retrouver l’indice d’un bouton Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 53 / 113 GRIDLAYOUT Grille (tableau) Ordre : équilibrage des lignes Taille : tous les composants ont la même taille On déclare le layout de la manière suivante : new GridLayout(int rows, int cols) (0 , 1) : une colonne (1, 0) : une ligne Modification de la grille setColumns(int cols) / getColumns() setRows(int rows) / getRows() 54 DES LAYOUTS POUR LES ÉDITEURS GRAPHIQUES GroupLayout Groupage {parallèle ; séquentiel} x {vertical, horizontal} Allignement vertical, horizontal, les deux GridBagLayout Expression de contrainte Grille avec des poids pour chaque case Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 55 / 113 MISE EN PAGE Choix des containers Choix des layouts Arbre Structure hierachique Contenant / Contenu (Graphe de scène) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 56 / 113 BOUTONS, GROUPE, ACTION LES BOUTONS JComponent AbstractButton JButton JToogleButton JCheckBox JMenuItem JCheckBox MenuItem JRadioButton JMenu JRadioButton MenuItem Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 58 / 113 ABSTRACTBUTTON Plusieurs icônes Méthode de positionnement du texte (et donc le l’îcone) setIcon ; setPressedIcon ; setRolloverIcon ; setSelectedIcon ; setRolloverSelectedIcon ; setDisabledIcon ; setDisabledSelectedIcon ImageIcon (String fileName) ou ImageIcon(URL imageLocation) setVerticalTextPosition(SwingConstants.RIGHT ou SwingConstants.LEFT ou SwingConstants.CENTER ou SwingConstants.LEADING ou SwingConstants.TRAILING (the default) ); setHorizontalTextPosition(SwingConstants.CENTER (the default) ou SwingConstants.TOP ou SwingConstants.BOTTOM); addActionListener doClic( ) : fait comme si on avait cliqué (event) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 59 / 113 JCOMPONENT ET HTML Un « Bouton » peut contenir du texte en html "<html>ligne1<br />ligne2</html>" JButton, JLabel, JMenuItem, JMenu, JRadioButtonMenuItem, JCheckBoxMenuItem, JTabbedPane, JToolTip, JToggleButton, JCheckBox and JRadioButton Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 60 / 113 JRADIOBUTTON / JCHECKBUTTON Bouton à état isSelected( ) setSelected( boolean) : ne provoque pas d’event ActionEvent : en sélection uniquement ItemEvent : en changement (sélection et sélection) addItemListener ItemListener : public void itemStateChanged(ItemEvent e) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 61 / 113 BUTTONGROUP Pour en sélectionner un seul parmi n : ButtonGroup getSelected ButtonModel (ce n’est pas le bouton lui-même mais un objet encapsulé) - fournit getActionCommand getElements Ce n’est pas un objet graphique new ButtonGroup() add(<boutton avec état>) : avec JRadioButton ou JToggleButton ou JRadioButtonMenuItem Retourne une Enumeration<AbstractButton> pattern iterator Changement de comportement Les boutons ne peuvent plus être désélectionnés autrement que pas la sélection d’un autre Pour reset : Enumeration<AbstractButton> enumeration = group.getElements(); while (enumeration.hasMoreElements( ) ) { AbstractButton ab =enumeration.nextElement(); group.remove(ab); ab.setSelected(false); group.add(ab); } Université Nice Sophia Antipolis // liste des éléments du // ButtonGroup // tant qu’il y a des élts // on prend le premier disponible // on l’enlève du ButtonGroup // on le déselectionne // on le remet dans le groupe L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 62 / 113 JTOOLBAR Container détâchable setFloatable( boolean ) // true par défaut Ajout de component par simple add Éléments collés Méthode addSeparator() Activation des « infobulles » setRollover( boolean ) // false par défaut Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 63 / 113 ACTION : REGROUPEMENT D’ACTIONLISTENER Interface Action Classe Abstraite AbstractAction Version « améliorée » des ActionListener Partage plus facile Communication par message : méthode putValue(String key , Object value) Action. NAME : un texte (qui s’affiche sur les boutons ou les menus) Action. LARGE_ICON_KEY ou Action. SMALL_ICON : une icône Action. ACTION_COMMAND_KEY : un texte « actionCommand » Action.MNEMONIC_KEY : un mnémonique Action.ACCELERATOR_KEY un raccourci clavier Action. SHORT_DESCRIPTION ou Action. LONG_DESCRIPTION : un texte qui décrit l’action (version longue ou courte utilisée par les bulles d’aide) Partage : setEnabled qui impactera tout les éléments gérés Partage : réaction via la méthode actionPerformed Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 64 / 113 ACTION : ASSOCIATION A passer en paramètre au constructeur ou avec la méthode setAction Utilisable par AbstractButton Différents constructeurs de AbstractAction (à étendre) http://docs.oracle.com/javase/tutorial/uiswing /examples/misc/ActionDemoProject/src/misc/ ActionDemo.java Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 65 / 113 MENU MENU / JMENU JMenuBar qui porte les JMenu Les JMenu portent : JMenuItem JRadioButtonMenuItem, etc. (ButtonGroup) Jseparator (pour séparer) jframe.setJMenuBar Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 67 / 113 JMENUITEM C’est un AbstractButton Texte, icône… Ajout de raccourci (Alt+Q) Quand le menu est ouvert : item.setMnemonic(KeyEvent.VK_Q); (souligne la lettre) Quand le menu n’est pas forcément ouvert item.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_Q, InputEvent.ALT_DOWN_MASK)); JMenu porte des JMenuItem Héritage… donc même fonctonnalités Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 68 / 113 MENU ET EVENT JMenuItem C’est un AbstractButton ActionEvent JRadioButtonMenuItem / JCheckBoxMenuItem ItemEvent Université Nice Sophia Antipolis possible L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 69 / 113 MENU CONTEXTUEL Généralement par clic droit (Windows) Un JPopupMenu porte des JMenuItem JRadioButtonMenuItem, etc. (ButtonGroup) JSeparator MouseListener sur les élèments avec le menu contextuel (mousePressed et mouseReleased) avec le code suivant : if (e.isPopupTrigger()) { popup.show(e.getComponent(), e.getX(), e.getY()); } Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 70 / 113 Image, Graphics 2D Ressource (images) : http://docs.oracle.com/javase/tutorial/index.html POO SEMESTRE 6 : INTERFACE GRAPHIQUE (4) MANIPULATION D’IMAGE JAVA.AWT.IMAGE Objet représentant les images getSource : obtenir le « producer » getHeight( imageObserver ) / getWidth ( imageObserver ) ImageObserver : pour être rappeler en cas de modification de l’image (chargement) Peut être null Pour les obtenir : javax.swing.ImageIcon java.awt.Toolkit Constructeur avec le nom du fichier Méthode getImage Pas de constructeur, mais une méthode statique (singleton) java.awt.Toolkit.getDefaultToolkit() méthode getImage("nomdufichier"); Méthode de Component public Image createImage(ImageProducer producer) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 73 / 113 basé sur un transparent de Richard Grin CLASSE JAVA.AWT.TOOLKIT Les sous-classes de la classe abstraite Toolkit implantent la partie de AWT qui est en contact avec le système d’exploitation hôte Quelques méthodes publiques : getScreenSize, getScreenResolution, getImage, createImage getDefaultToolkit fournit une instance de la classe qui implante Toolkit Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 74 / 113 IMAGEICON Plusieurs constructeurs : un nom de fichier absolu ou relatif URL (adresse Internet ; objet de type URL) une image (Image) un tableau de byte (byte[]) Diverses méthodes getImageLoadStatus() : image chargée ? MediaTracker.ABORTED, MediaTracker.ERRORED, MediaTracker.COMPLETE, MediaTracker.LOADING getIconWidth() et getIconHeight() : les dimensions getImage( ) : la « source » Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 75 / 113 IMAGE COMME DES RESSOURCES Si on indique un chemin : depuis là où est exécuter le programme java Sous eclipse : racine du projet Problème en cas de distribution sous forme de jar getResource de la classe Class nomFichier : chemin par rapport au .class URL url = getClass().getResource(nomFichier); ImageIcon icone = new ImageIcon(url); Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 76 / 113 MEDIATRAKER Intégré dans ImageIcon Pour attendre la « construction d’une image » Utilise pour le bon foncionnement // ajout d’image à « synchroniser » tracker.addImage(changedImg, 1); // choix du “canal” try { tracker.waitForID(1); // attente de toutes les images du canal } catch(Exception e) { System.out.println("errors while loading images" + e.getMessage()); } Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 77 / 113 AFFICHER UNE IMAGE Avec un Jcomponent JLabel JButton, etc. Par un dessin « explicite » Méthodes Université Nice Sophia Antipolis drawImage de Graphics L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 78 / 113 JAVA.AWT.GRAPHICS (BIS) Contexte graphique (« morceau d’écran ») Permet de dessiner Changer de crayon : setColor drawRect, drawOval, drawPolygon, drawString, fillRect, fillOval Obtenu automatiquement (repaint(), redimensionnement, etc.) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 79 / 113 JAVA.AWT.GRAPHICS (BIS) - DRAWIMAGE Dessin telle quelle (avec une éventuelle couleur de fond) drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) drawImage(Image img, int x, int y, ImageObserver observer) Dessin avec redimensionnement drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) Dessin d’une sous partie de l’image avec redimensionnement drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer) drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 80 / 113 basé sur un transparent de Richard Grin OÙ DESSINER ? Insets insets = getInsets(); (0,0) = ( getX(), getY() ) x insets.top Surface d’affichage du insets.left insets.right Composant (insets : pour laisser la place pour les bordures) getHeight( ) insets.bottom getWidth( ) y Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 81 / 113 GRAPHICS ET CHAINE DE CARACTÈRE : FONT Class Font Méthodes d’accès aux caractéristiques getSize( ) / getSize2D( ) isBold( ) / isItalic( ) / isPlain( ) Construction : Font(String name, int style, int size) Méthode static Font.getFont(String name) Méthode getFont( ) de Component Méthodes de Font deriveFont Taille (float), style (Font.PLAIN ; Font.BOLD ; Font.ITALIC , Font.BOLD | Font.ITALIC ), (AffineTransformation) Exemple pour grossir la taille d’un component : component.setFont( component.getFont().deriveFont(72f) ) ; Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 82 / 113 CALCULEZ LA TAILLE D’UNE CHAINE Connaitre en pixel la taille d’une chaine Méthode getFontMetrics Placer dans le Graphics Découper en « lignes » Couper (…) De component : public FontMetrics getFontMetrics(Font font) De Graphics : public FontMetrics getFontMetrics() FontMetrics Permets de connaitre les dimensions de la font Largeur (int) : charWidth(char ch) / stringWidth(String str) Espace occupé dans un graphics (Rectangle2D) : getStringBounds(String str, Graphics context) Hauteur d’une ligne (int) : getHeight( ) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 83 / 113 DESSINER UNE CHAINE DANS UN GRAPHICS (Calculs avec les FontMetrics) Peut être assez complexe pour gérer tous les cas drawString(String str, int x, int y) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 84 / 113 basé sur un transparent de Richard Grin GRAPHICS2D En fait, la méthode paintComponent reçoit une instance de la classe Graphics2D, sousclasse de Graphics Graphics2D offre beaucoup plus de possibilités que Graphics rotations, les mises à l’échelle, le choix de la largeur de trait, Antialiasing, g.setStroke(new BasicStroke(epaisseur)) ; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); le tracé de rectangle 3D Graphics2D g2 = (Graphics2D) g; Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 85 / 113 JAVA.AWT.IMAGE.BUFFEREDIMAGE C’est une java.awt.Image Création simple BufferedImage(int width, int height, int imageType) Largeur, hauteur TYPE_3BYTE_BGR, TYPE_4BYTE_ABGR... Pour dessiner dedans public Graphics2D createGraphics() Manipulation d’image getRGB(x,y) // coordonnées pixel // retourne un int « rgb » // rgb : sur 3 ou 4 octet (alpha, red, green, blue) setRGB(x, y, rgb) Traitement par zone Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 86 / 113 EXEMPLE : PHOTOCOPIER UN COMPONENT public class Cloning extends JComponent { BufferedImage img ; public Cloning(JComponent cpt) { img = new BufferedImage(cpt.getWidth(), cpt.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g = img.createGraphics(); cpt.paint(g); setSize(cpt.getSize()); setPreferredSize(getSize()); setMaximumSize(getSize()); setMinimumSize(getSize()); On prend une photo du copié On prend les dimensions du copié } public void paintComponent(Graphics g) { if (img != null) g.drawImage(img, 0, 0, null); } On dessine la photo } Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 87 / 113 DOUBLE-BUFFERING EN AWT java.awt.image.BufferedImage buffImg = new BufferedImage(width, height, type); type : BufferedImage.TYPE_4BYTE_ABGR par exemple Dans paint(Graphics g) : Graphics grph = buffImg.createGraphics(); // on dessine dans grph g.drawImage(buffImg, 0, 0, null) setDoubleBuffered pour SWING Optimisation toujours possible Dessin Université Nice Sophia Antipolis par tranche, pour ne pas « tout » redessiner L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 88 / 113 IMAGEIO Paquetage javax.imageio ; class ImageIO Ce paquetage permet de charger et sauvegarder facilement n’importe quel type d’image Il utilise la notion de plugin pour supporter les différents types d’image Méthodes static read pour lire depuis un fichier local (File), un flot ou un URL (lecture directe sans utilisation d’un thread en parallèle) Méthodes write pour écrire un BufferedImage dans un fichier ou un flot, en choisissant le codage d’écriture Format par défaut : gif, png, jpg des paquetages sur le Web pour ajouter d’autres formats public static void scanForPlugins() Scans for plug-ins on the application class path String[] formatNames = ImageIO.getReaderFormatNames(); Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 89 / 113 IMAGEIO BufferedImage image ; // après construction… Graphics g = image.getGraphics(); // on peut dessiner dans g, par exemple avec // component.paint(g) ; File imageFile = new File(filename); try { ImageIO.write(image, "png", imageFile); } catch (IOException e) { System.err.println("echec dans la sauvegarde"); } Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 90 / 113 Input, KeyListener & Focus, Evénements liés aux composants… Ressource (images) : http://docs.oracle.com/javase/tutorial/index.html PROJET DE LICENCE : INTERFACE GRAPHIQUE (5) Saisie de Texte / Comment entrez des valeurs INPUT basé sur un transparent de Richard Grin LE TEXTE EN SWING Jlabel : texte (et icone) non modifiable JTextField : entrer du texte (sur une ligne) JTextArea : quelques lignes de texte Touche « entrée » provoque un actionListener Édition « texte brut » JEditorPane : édition « formatée » StyledDocument (structure hiérarchique) addDocumentListener / addUndoableEditListener undo / redo JTextPane (découpage en paragraphe) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 93 / 113 HÉRITAGE JComponent JTextComponent JLabel Manipule des StyledDocument JTextField JPasswordField JTextArea JFormattedTextField JEditorPane JTextPane Utilise des formats comme : amountFormat = NumberFormat.getNumberInstance( ); Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 94 / 113 basé sur un transparent de Richard Grin JTEXTCOMPONENT Modèle = Document / Vue / Contrôleur Contient les méthodes de base pour traiter une zone de saisie ou/et d’affichage de texte : {get/set}Text pour obtenir ou mettre le texte (ou une partie du texte) contenu dans le composant setEditable() pour indiquer si l’utilisateur peut modifier le texte copier/couper/coller avec le clipboard du système utilisation et gestion du point d’insertion (caret) addInputMethodListener addCaretListener etc. Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 95 / 113 Interagir avec le clavier, savoir sur quel composant cela se passe, EVENEMENT CLAVIER ET FOCUS EVÉNEMENTS CLAVIER KeyListener Méthodes keyPressed puis keyTyped puis keyReleased KeyEvent Constante VK_xxx pour le code de la touche Hérite de InputEvent : donc getModifiers() et isAltDown(), etc. getKeyChar() et getKeyCode() (code de la touche) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 97 / 113 FOCUS Les événements claviers vont sur le composant qui a le focus 2 autres façons pour obtenir le focus Un seul composant peut « avoir le focus » à un moment donné La fenêtre qui « a le focus » est celle qui contient ce composant Le plus souvent un composant obtient le focus quand l’utilisateur clique sur lui Il peut aussi l’obtenir par programmation avec les méthodes requestFocus() ou requestFocusInWindow() de la classe Component Attention au retour d’une fenêtre (de dialogue) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 98 / 113 basé sur un transparent de Richard Grin MÉTHODES ET FOCUS Dans la classe Component la méthode boolean isFocusable() permet de savoir si un composant peut l’avoir void setFocusable(boolean) permet de modifier cette propriété Dans la classe Component, 2 méthodes pour passer au composant suivant ou précédent : transfertFocus et transfertFocusBackward les fenêtres sont des composants FocusListener : méthodes focusGained et focusLost Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 99 / 113 basé sur un transparent de Richard Grin MNEMONICS ET ACCELERATORS Raccourcit des boutons / menus Alt (mouseless modifier) + touche Dans la class AbstractButton setMnemonic(code) avec un code de touche (KeyEvent.VK_xxx) Pour les menus : il faut que le menu soit ouvert Dans la class JTabbedPane setMnemonicAt(int tabIndex, int code) avec pour la tabIndex un indice d’un onglet Accelerateur pour les JMenuItem Raccourcit clavier KeyStroke.getKeyStroke(int keyCode, int modifiers) C.f . KeyEvent et InputEvent pour les modifiers Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 100 / 113 basé sur un transparent de Richard Grin TOOLTIPS : AIDE CONTEXTUELLE On peut ajouter une bulle d’aide ou de description à n’importe quel composant : composant.setToolTipText("Texte"); Cette bulle s’affiche lorsque le pointeur de la souris est positionné depuis un certain temps sur le composant Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 101 / 113 EVÉNEMENTS LIÉS AUX COMPOSANTS COMPONENTLISTENER Réagir à des changements sur le component ComponentListener componentHidden(ComponentEvent) componentMoved(ComponentEvent) Called after the listened-to component moves, relative to its container. For example, if a window is moved, the window fires a component-moved event, but the components it contains do not. componentResized(ComponentEvent) Called after the listened-to component is hidden as the result of the setVisible method being called. Called after the listened-to component's size (rectangular bounds) changes. componentShown(ComponentEvent) Called after the listened-to component becomes visible as the result of the setVisible method being called. All of these methods are also in the adapter class, ComponentAdapter. Il existe aussi ContainerListener (add / remove) Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 103 / 113 COMPONENTEVENT ComponentEvent Component getComponent() Returns the component that fired the event. You can use this instead of the getSource method. public String paramString() Returns a parameter string identifying this event. This method is useful for event-logging and for debugging. Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 104 / 113 OUTILS COMPLÉMENTAIRES FENÊTRAGE INTERNE JInternalFrame : Jcomponent à placer à l’intérieur d’une fenêtre et qui se comporte comme une fenêtre Iconifier, Agrandir, Déplacer, etc. Va de paire avec JDesktopPane (ou un layout null) http://docs.oracle.com/javase/tutorial/uiswing /components/internalframe.html Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 106 / 113 CLAQUE (JLAYER) Design Pattern Decorator Ajoute un « plus », ici graphique http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html class WaitLayerUI extends LayerUI<JPanel> implements ActionListener Avec une méthode public void paint (Graphics g, JComponent c) Création du panel à décorer JLayer<JPanel> jlayer = new JLayer<JPanel>(panel, layerUI); Ajout du jlayer à la fenêtre (et non pas du panel) Le JLayer est le décorateur, le LayerUI est la « stratégie » de décoration Délagation de la décoration à la classe LayerUI on ne refait que le LayerUI, on redessine ce qu’on veut Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 107 / 113 COMPORTEMENT DE CERTAINS WIDGETS Comportement des boutons (feedback) JComboBox (menu déroulant) Etc. Modification avec ButtonGroup Comportement interne Gestion de la taille Gestion de l’alignement Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 108 / 113 Un bilan sous forme de questions QUESTIONS DIVERSES HÉRITAGE OU DÉLÉGATION ? Une question : l’objet doit-il « être un » (un composant graphique) ? Héritage quand : Modification du comportement Lourd ou systématique Délégation sinon Décoration possible (pour ajout de fonctionnalité mineur) C.f. JScrollPane, JLayer, etc. Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 110 / 113 LISTENER : UNE INSTANCE OU PLUSIEURS ? Généralement plus simple de plusieurs instances Autant que d’objet écoutés Évite des tests sur la source (et donc de la dépendance dans le code) Cas particulier des Action Eventuellement (rare) une seule instance si Besoin de « synchroniser » des sources d’événement Besoin d’économiser Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 111 / 113 LISTENER : CLASSE OU CLASSE INTERNE OU CLASSE INTERNE ANONYME ? À nouveau la question : l’objet doit-il « être un » (listener) ? Variation dans la réutilisation, le dynamisme : Classe : listener réutilisable, choix à faire lors des instanciation Classe interne : rattachement à la classe « écoutée », réutilisation plus compliquée Classe interne anonyme : comportement interne à la classe « principale », pas d’exportation de ce comportement Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 112 / 113 INTERFACE GRAPHIQUE : EDITION MANUELLE OU ÉDITEUR (À LA NETBEANS) ? Édition à la main Parfois « rédhibitoire » Maitrise totale Editeur Graphique d’Interface Facile et rapide Code plutôt laid : nom des variables, listener qui appel des méthodes privées, etc. code « non modifiable » dans l’éditeur Utilisation de layout complexe (GroupLayout ou GridBagLayout) et de classe propre à l’éditeur Université Nice Sophia Antipolis L3 Informatique – Projet de Licence – dev UI – Philippe Renevier Gonin 113 / 113