Introduction Intro Développement Interface Graphique ...deptinfo.unice.fr/~renevier/POO/cours/01 -...

137
Introduction Intro – Développement Interface Graphique (Swing) – Android – – Processus – Intervenants : Éric Valade, Philippe Renevier Gonin http://deptinfo.unice.fr/~renevier/POO

Transcript of Introduction Intro Développement Interface Graphique ...deptinfo.unice.fr/~renevier/POO/cours/01 -...

Introduction

Intro – Développement Interface Graphique (Swing)– Android –

– Processus –

Intervenants : Éric Valade, Philippe Renevier Gonin

http://deptinfo.unice.fr/~renevier/POO

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 02 / 126

• Programmation orientée objet par la pratique

• GUI – Swing– (G)UI = (Graphical) User Interface

– Interface et concepts classiques

– événements

• Android– Interface graphique

– événements

• (Introduction aux) Processus (thread)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 03 / 126

• 1 séances / 3h sur un éditeur (créateur) d’image– Concepts généraux d’une UI

• Sur le même sujet : – 1 séance / 3h sur la prise en main Android

– 1 séance / 3h sur une « application » Android (client d’un chat)

• 2 séances / 6h sur Android et Thread (jeu des allumettes)

• 1 séance en réserve (nouveau sujet ou pour finir)

• Calendrier propre à chaque groupe

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 04 / 126

• Note de tp (30%) :

– présence,

– comportement,

– avancement

• Note de contrôle intermédiaire (30%)

– 1 ou 2 QCM

• Un contrôle terminal sur papier (40%)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 05 / 126

Un premier tour d’horizon Composant Graphique, Layout, Event

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 06 / 126

• 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• Technologie vieillissante, mais les concepts sont là

– JavaFX

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 07 / 126

• Comparaison SWING / HTML (puis android)• Component / Container

– HTML : des balises qui peuvent en contenir d’autres (DTD)– SWING : des container et des components, les container étant des

components– Dans les deux cas : une arborescences

• Layout– HTML : Utilisation de CSS pour changer l’organisation « statiques » (par

défaut, ordre linéaire vertical selon l’écriture du code html)– SWING : délégation par le container à un LayoutManager qui définit le

placement et la taille de chaque components contenu

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 08 / 126

• É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)– Coordonnées

• Origine au coin supérieur gauche• x (width) vers la droite et y (height) vers le bas

– Visible (boolean) ; Opaque (boolean) – Une couleur de fond (background) et une couleur d’écriture (foreground)– Etc.

• Méthode public void paint(Graphics g)

(0,0)

x

y

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 09 / 126

• 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.)• Graphics2D : 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));

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 10 / 126

• Couleur additive

• 4 octets (0-255)

– Rouge (getRed)

– Vert (getGreen)

– Bleu (getBlue)

– Transparence (getAlpha)

• .darker() ; .brighter()

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 11 / 126

• Hérite de Component

• Pattern Composite

– Porte d’autres Component (y compris des Container)

Component

Containter

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 12 / 126

Exemple : paint(g)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 13 / 126

• Hérite de Component• Pattern Composite

– Porte d’autres Component (y compris des Container)

• Organisation – LayoutManager

• Liaison dynamique (affectation possible), une délégation

– 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

Component

Containter

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Layout

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 14 / 126

• Définit l’organisation• Défini par une classe (≠ du css)• 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.

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 15 / 126

• Organisation

– 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)

• Alignement des bords :

– setAlignmentX(Component.LEFT_ALIGNMENT); pour aligner les bords gauches

• Insertion de « blancs » pour remplir (séparation)

– container.add(Box.createVerticalGlue());

– ligne.add(Box.createHorizontalGlue());

• Insertion de “blancs” pour combler

– zoneOutils.add(Box.createVerticalBox());

• Insertion de « blancs » pour espacer…

– container.add(Box.createRigidArea(new Dimension(5,5)));

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 16 / 126

• setLayout(null)

• Pas d’intelligence au placement / dimensionnement

• Chaque component doit

– Avoir une taille (setSize)

– Avoir une position (setLocation)

• Positionnement au pixel…

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 17 / 126

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 17 / 126

Fenêtre en BorderLayout

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 17 / 126

Fenêtre en BorderLayout

Un JPanelsans

Layout(Layout

null)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 17 / 126

Colonne (Jpanel) en BoxLayout

Fenêtre en BorderLayout

Un JPanelsans

Layout(Layout

null)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 17 / 126

Colonne (Jpanel) en BoxLayout

Sous élément

en BoxLayout

Fenêtre en BorderLayout

Un JPanelsans

Layout(Layout

null)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 18 / 126

fenêtre

contentPane

...

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 18 / 126

fenêtre

contentPane

...

zoneOutils

Bouton « Aucune »

Bouton « Rectangle »

Bouton « Ellipse »

« West »

1

2

3

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 18 / 126

fenêtre

contentPane

...

zoneOutils

Bouton « Aucune »

Bouton « Rectangle »

Bouton « Ellipse »

« West »

1

2

3

Ellipse

zoneDessin

Ellipse

Rectangle

Rectangle

Rectangle

« Center »

1

2

3

4

5

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 19 / 126

• repaint() : pour demander à redessiner le component• validate() : pour demander de valider (et redessiner) le component et ce qu’il

contient• 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…

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 20 / 126

• 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é pourafficher des pop-up menus

Forward de méthode sur le contentPane

contentPane avec un BorderLayout par défaut

basé sur un transparent d’Audrey Occello

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 21 / 126

• setVisible( boolean )

• Une position sur l’écran

– setLocation

• Besoin d’une taille

– Méthode pack( ) : calcul de la taille optimale (basée sur les layouts)

– Ou setSize

• WindowListener ou setDefaultCloseOperation

– Par défaut, fermer la fenêtre revient à la cacher

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 22 / 126

basé sur un transparent

d’Audrey Occello

Comme toutes les bibliothèques graphiques, il y a des objets de « bas niveau » (JPanel) et d’autre de plus haut niveau (JTable), etc.

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 23 / 126

• Hérite de Container– Prolongement du pattern COMPOSITE– Traitement « sans connaitre explicitement la classe réelle» des composants

• Méthodes de commodité– setPreferredSize, setMaximumSize, setMinimumSize– setDoubleBuffered(true/false) / isDoubleBuffered()– setOpaque(true / false)

• Dessin à l’écran : paint (méthode template) appelle– paintComponent– paintBorder– paintChildren– Surcharge en général de paintComponent et appel au « super.paintComponent » pour

profiter de l’implémentation initiale

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 24 / 126

• setBorder(Border border)• BorderFactory pour obtenir les bords existants

– Pattern Factory– CompoundBorder– createDashedBorder– createEmptyBorder– createEtchedBorder– createLineBorder– createMatteBorder – Etc. – http://docs.oracle.com/javase/8/docs/api/javax/swing/BorderFactory.html

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 25 / 126

• les boutons– JButton /JToggleButton / JCheckBox / JRadioButton

– java.awt.ButtonGroup (méthode add)

• Les îcones : javax.swing.ImageIcon créer avec le nom d’un fichier image par exemple

• Les champs textuels – JTextField/ JTextArea

• Menus : les JMenuBar, JMenu, JMenuItem

• Etc…

• http://docs.oracle.com/javase/tutorial/uiswing/

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 26 / 126

• JColorChooser– Pattern Factory pour obtenir

– JColorChooser.showDialog(Component élément de référence, String message du choix, Color couleur initiale)

• JDialogPattern Factory pour obtenir le type de dialogue

– Exemple : String name = JOptionPane.showInputDialog("entrez le nom de l'image (format png)");

• JTable

• etc.

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 27 / 126

• Choix à faire

– Cas de la JFrame par exemple :

• extends

• Attribut de la classe

• Extension de la boite à outils

– « Petites » modifications

• Graphiques

• Ou comportementales

– Objet qui n’existe pas

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 28 / 126

• 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 »

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 29 / 126

• 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.

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 30 / 126

• Réalisation d’une JFrame

– Lancement du thread graphique (setVisible)

– Fin du programme (setDefaultCloseOperation)

• Ajout d’un bouton (JButton) et d’un label (JLabel)

– Position dans le BorderLayout

– Raccourcit (f.getContentPane().add() vs f.add() )

– Placement du f.setVisible(true) (le plus tard possible)

• Ajout d’un écouteur des clics sur le bouton (ActionListener)

– Compte le nombre de clic et change le texte du bouton

– Evolution 1 : peut changer plusieurs textes

– Evolution 2 : écoute aussi les événements souris (MouseListener) [sur un des labels]

• Les possibilités :

– 1 classe pour ActionListener + MouseListener, 1 seule instance pour écouter le bouton et le label

– 1 classe pour ActionListener + MouseListener, 2 instances : une pour le bouton, une autre pour le label

– autre possibilité : 2 classes, une pour ActionListener, 1 pour MouseListener

– autre possibilité : des listeners pour modifier un seul label… une instance de listener par label modifié

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 31 / 126

Swing ; événement, classe interne

http://deptinfo.unice.fr/~renevier/POO

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 32 / 126

Les événements et leurs utilisations en java

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 33 / 126

• Exécution non linaire du code– Établissement de liens

– Appel (utilisation des liens) lors qu’un événement se produit

– Nécessite un thread

• Etablissement des liens– Interface E implémentée par l’écouteur (observer)

– add et remove de E pour l’écouté (observable)

– Appel aux écouteurs par l’écouté via l’interface E lorsque l’événement se produit

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 34 / 126

void aMethod()boolean anotherMethod()

List<E> listeners

void add(E)void remove(E)

void fireEvent()

Observable

<<interface>> Observer

void aMethod()boolean anotherMethod()

ConcreteObserver

void aMethod()boolean anotherMethod()

AnotherConcreteObserver

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 35 / 126

Système (ou initialisation…)

Observableo = new Obsevable()

AnotherConcreteObserverobs = new Observer()

o.add(obs)

listeners.add(obs)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 36 / 126

ObserverSystème (ou thread ou acteur…)

Observable Observer

o.fireEvent()

obs.aMethod()

loop [ Observer obs : listeners]

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 37 / 126

• Actions non séquentielles– Besoin d’événement déclencheur– 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 »

• Les étapes :– 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…

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 38 / 126

• 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 appelle tous ceux qui l’observe

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 39 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 40 / 126

• Constructeurs– Object source, int id, String command

– Object source, int id, String command, int modifiers

– Object source, int id, String command, long when, int modifiers

• Méthodes spécifiques– String getActionCommand() nom de l’action

– int getModifiers() savoir si une touche est pressée

– long getWhen() quand ?

– String paramString()

• Méthodes générales (ObjectEvent)– Object getSource() objet à l’origine de l’événement

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 41 / 126

• void actionPerformed(ActionEvent e)

• Appelé par l’objet source de l’action (sur lequel l’utilisateur a cliqué)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 42 / 126

// 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);

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 43 / 126

// 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);

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 44 / 126

• implements ActionListener

// un fenêtre nécessaire pour la popup de dialogue

private JFrame parent ;

// le constructeur

public MonEcouteurDAction(JFrame fen)

{

parent = fen;

}

44

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 45 / 126

// 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);

}

}

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 46 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 47 / 126

• Constructeurs– 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

• Méthodes spécifiques– 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 getSource() objet à l’origine de l’événement

47

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 48 / 126

Point p;

/*

** MouseListener : on mémorise le début du glisser

*/

public void mousePressed(MouseEvent e)

{

p = e.getPoint();

}

public void mouseReleased(MouseEvent e) {}

public void mouseClicked(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 49 / 126

/*

** 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 void

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 50 / 126

• Observable : – Sur qui l’événement se produit

– Liste de ceux qui s’abonne (les observers)• Liaison dynamique : add / remove

– Rappel des observers quand « cela » se produit• Appel via une méthode définie dans l’interface que doivent implémenter les

observers

• Observer : – Celui qui écoute, qui s’abonne

– Appelé quand cela se produit

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 51 / 126

• 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.

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 52 / 126

• Un (unique) thread graphique (rafraichissement et file des événements)• Observable : les objets graphiques• Observer : interface proposée par l’API

– Classe à part entière– Classe interne (encapsulation) – Classe interne anonyme (encapsulation et masquage)

• Liaison : – add ou set (un seul listener)

• Choix : – Un objet qui en écoutent plusieurs du même type– Un objet qui peut écouter plusieurs types d’objets– Un objet écouté par un seul objet spécifique– Etc.

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 53 / 126

Des classes internes et anonymes

Souvent utiliser avec les listeners

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 54 / 126

• Définition

– Dans une classe

– Dans une méthode, entre { }

– En paramètre (anonyme)

• Observable :

– ClassePrincipe.class

– ClassePrincipe$1NomInterne.class

– ClassePrincipe$2.class

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 55 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 56 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 57 / 126

• 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));

}

}

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 58 / 126

• 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 »

• Autre possibilité avec les lambda : button.addActionListener(e ->

/* ce qu’il faut faire… */);

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 59 / 126

Layout ; menu ; bouton

Ressource (images) : http://docs.oracle.com/javase/tutorial/index.html

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 60 / 126

Les différentes « mises en page » internes aux composants graphiques

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 61 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 62 / 126

• Organisation

– 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)

• Alignement des bords :

– setAlignmentX(Component.LEFT_ALIGNMENT); pour aligner les bords gauches

– Sur les composants ajoutés

• Insertion de « blancs » pour remplir (séparation)

– colonne.add(Box.createVerticalGlue());

– ligne.add(Box.createHorizontalGlue());

• Insertion de “blancs” pour combler

– zoneOutils.add(Box.createVerticalBox());

• Insertion de « blancs » pour espacer…

– container.add(Box.createRigidArea(new Dimension(5,5)));

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 63 / 126

• setLayout(null)

• Pas d’intelligence au placement / dimensionnement

• Chaque component doit

– Avoir une taille (setSize)

– Avoir une position (setLocation)

• Positionnement au pixel…

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 64 / 126

• 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 lelayout :

– Paramètre du constructeur ou setAlignement(int)

– FlowLayout.LEFT ; RIGHT ; CENTER ; LEADING ; TRAILING

• Gestionnaire d’affichage par défaut des JPanel

70

basé sur un transparent d’Audrey Occello

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 65 / 126

• 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)

71

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 66 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 67 / 126

• 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()73

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 68 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 69 / 126

• Choix des containers

• Choix des layouts

• Arbre

– Structure hierachique Contenant / Contenu

– (Graphe de scène)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 70 / 126

Illustration de l’héritage : partage de méthodes, spécialisations, etc.

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 71 / 126

AbstractButton

JButton

JComponent

JMenuItemJToogleButton

JCheckBoxMenuItem

JMenu

JRadioButtonMenuItem

JCheckBox JRadioButton

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 72 / 126

• Plusieurs icônes– setIcon ; setPressedIcon ; setRolloverIcon ; setSelectedIcon ;

setRolloverSelectedIcon ; setDisabledIcon ; setDisabledSelectedIcon– ImageIcon (String fileName) ou ImageIcon(URL imageLocation)

• Méthode de positionnement du texte (et donc le l’îcone) – setVerticalTextPosition(SwingConstants.RIGHT ou SwingConstants.LEFT ou

SwingConstants.CENTER ou SwingConstants.LEADING ouSwingConstants.TRAILING (the default) );

– setHorizontalTextPosition(SwingConstants.CENTER (the default) ouSwingConstants.TOP ou SwingConstants.BOTTOM);

• addActionListener• doClic( ) : fait comme si on avait cliqué (event)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 73 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 74 / 126

• 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)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 75 / 126

Pour en sélectionner un seul parmi n : ButtonGroupCe n’est pas un objet graphique

new ButtonGroup()

add(<boutton avec état>) : avec JRadioButton ou JToggleButton ou JRadioButtonMenuItem

getSelectedButtonModel (ce n’est pas le bouton lui-même mais un objet encapsulé) - fournit getActionCommand

getElementsRetourne 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(); // liste des éléments du ButtonGroup

while (enumeration.hasMoreElements( ) ) // tant qu’il y a des élts

{

AbstractButton ab =enumeration.nextElement(); // on prend le premier disponible

group.remove(ab); // on l’enlève du ButtonGroup

ab.setSelected(false); // on le déselectionne

group.add(ab); // on le remet dans le groupe

}

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 76 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 77 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 78 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 79 / 126

Illustration de l’héritage : partage de méthodes, spécialisations, etc.

Illustration d’une agrégation (le menu et ses items)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 80 / 126

• JMenuBar qui porte les JMenu

• Les JMenu portent :

– JMenuItem

– JRadioButtonMenuItem, etc.

– JSeparator (pour séparer)

• JFrame.setJMenuBar

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 81 / 126

• 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 ouvertitem.setAccelerator(KeyStroke.getKeyStroke(

KeyEvent.VK_Q,InputEvent.ALT_DOWN_MASK));

• JMenu porte des JMenuItem• Héritage… donc même fonctonnalités

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 82 / 126

• JMenuItem

– C’est un AbstractButton

– ActionEvent

• JRadioButtonMenuItem / JCheckBoxMenuItem

– ItemEvent possible

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 83 / 126

• 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());

}

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 84 / 126

Image, Graphics 2D

Ressource (images) : http://docs.oracle.com/javase/tutorial/index.html

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 85 / 126

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 86 / 126

• 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

• Constructeur avec le nom du fichier• Méthode getImage

– java.awt.Toolkit• Pas de constructeur, mais une méthode statique (singleton) java.awt.Toolkit.getDefaultToolkit() • méthode getImage("nomdufichier");

– Méthode de Componentpublic Image createImage(ImageProducer producer)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 87 / 126

• 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

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 88 / 126

• 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 »

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 89 / 126

• 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);

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 90 / 126

• 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());}

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 91 / 126

• Avec un Jcomponent

– JLabel

– JButton, etc.

• Par un dessin « explicite »

– Méthodes drawImage de Graphics

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 92 / 126

• Contexte graphique (« morceau d’écran »)

• Permet de dessiner

– Changer de crayon : setColor

– drawRect, drawOval, drawPolygon, drawString, fillRect, fillOval

• Obtenu automatiquement (repaint(), redimensionnement, etc.)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 93 / 126

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 redimensionnementdrawImage(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 redimensionnementdrawImage(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)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 94 / 126

Surface d’affichage du Composant

(insets : pour laisser la place pour les bordures)

(0,0) = ( getX(), getY() )

Insets insets = getInsets();

insets.top

insets.bottom

insets.left insets.right

getWidth( )

getHeight( )

x

y

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 95 / 126

• 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) ) ;

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 96 / 126

• Connaitre en pixel la taille d’une chaine– Placer dans le Graphics– Découper en « lignes »– Couper (…)

• Méthode getFontMetrics– 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( )

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 97 / 126

• (Calculs avec les FontMetrics)

– Peut être assez complexe pour gérer tous les cas

• drawString(String str, int x, int y)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 98 / 126

• 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,

• g.setStroke(new BasicStroke(epaisseur)) ;

– Antialiasing, • g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

– le tracé de rectangle 3D

• Graphics2D g2 = (Graphics2D) g;

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 99 / 126

• C’est une java.awt.Image• Création simpleBufferedImage(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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 100 / 126

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());

}

public void paintComponent(Graphics g){

if (img != null) g.drawImage(img, 0, 0, null);}

}

On prend les dimensions du copié

On prend une photo du copié

On dessine la photo

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 101 / 126

• 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 par tranche, pour ne pas « tout » redessiner

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 102 / 126

• 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();

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 103 / 126

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"); }

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 104 / 126

Input, KeyListener & Focus, Evénements liés aux composants…

Ressource (images) : http://docs.oracle.com/javase/tutorial/index.html

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 105 / 126

Saisie de Texte / Comment entrez des valeurs

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 106 / 126

• Jlabel : texte (et icone) non modifiable

• JTextField : entrer du texte (sur une ligne)– Touche « entrée » provoque un

actionListener

• JTextArea : quelques lignes de texte– Édition « texte brut »

• JEditorPane : édition « formatée »– StyledDocument (structure hiérarchique)

• addDocumentListener / addUndoableEditListener

• undo / redo

– JTextPane (découpage en paragraphe)

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 106 / 126

• Jlabel : texte (et icone) non modifiable

• JTextField : entrer du texte (sur une ligne)– Touche « entrée » provoque un

actionListener

• JTextArea : quelques lignes de texte– Édition « texte brut »

• JEditorPane : édition « formatée »– StyledDocument (structure hiérarchique)

• addDocumentListener / addUndoableEditListener

• undo / redo

– JTextPane (découpage en paragraphe)

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 106 / 126

• Jlabel : texte (et icone) non modifiable

• JTextField : entrer du texte (sur une ligne)– Touche « entrée » provoque un

actionListener

• JTextArea : quelques lignes de texte– Édition « texte brut »

• JEditorPane : édition « formatée »– StyledDocument (structure hiérarchique)

• addDocumentListener / addUndoableEditListener

• undo / redo

– JTextPane (découpage en paragraphe)

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 106 / 126

• Jlabel : texte (et icone) non modifiable

• JTextField : entrer du texte (sur une ligne)– Touche « entrée » provoque un

actionListener

• JTextArea : quelques lignes de texte– Édition « texte brut »

• JEditorPane : édition « formatée »– StyledDocument (structure hiérarchique)

• addDocumentListener / addUndoableEditListener

• undo / redo

– JTextPane (découpage en paragraphe)

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 106 / 126

• Jlabel : texte (et icone) non modifiable

• JTextField : entrer du texte (sur une ligne)– Touche « entrée » provoque un

actionListener

• JTextArea : quelques lignes de texte– Édition « texte brut »

• JEditorPane : édition « formatée »– StyledDocument (structure hiérarchique)

• addDocumentListener / addUndoableEditListener

• undo / redo

– JTextPane (découpage en paragraphe)

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 106 / 126

• Jlabel : texte (et icone) non modifiable

• JTextField : entrer du texte (sur une ligne)– Touche « entrée » provoque un

actionListener

• JTextArea : quelques lignes de texte– Édition « texte brut »

• JEditorPane : édition « formatée »– StyledDocument (structure hiérarchique)

• addDocumentListener / addUndoableEditListener

• undo / redo

– JTextPane (découpage en paragraphe)

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 107 / 126

JTextComponent

JTextField

JComponent

JEditorPaneJTextArea

JTextPane

JLabel

JPasswordField JFormattedTextField

Manipule des StyledDocument

Utilise des formats comme : amountFormat = NumberFormat.getNumberInstance( );

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 108 / 126

• 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• addInputMethodListener

– 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)

• addCaretListener

– etc.

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 109 / 126

Interagir avec le clavier, savoir sur quel composant cela se passe,

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 110 / 126

• 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)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 111 / 126

• Les événements claviers vont sur le composant qui a 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

• 2 autres façons pour obtenir le focus– Le plus souvent un composant obtient le focus quand l’utilisateur

clique sur lui

– Il peut aussi l’obtenir par programmation avec les méthodesrequestFocus() ou requestFocusInWindow() de la classe Component

• Attention au retour d’une fenêtre (de dialogue)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 112 / 126

• 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

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 113 / 126

• 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

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 114 / 126

• 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

basé sur un transparent de Richard Grin

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 115 / 126

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 116 / 126

• Réagir à des changements sur le component• ComponentListener

– componentHidden(ComponentEvent)• Called after the listened-to component is hidden as the result of the setVisible method being called.

– 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'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)

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 117 / 126

• 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.

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 118 / 126

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 119 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 120 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 121 / 126

• Comportement des boutons (feedback)

• JComboBox (menu déroulant)

• Etc.

• Modification avec ButtonGroup

• Comportement interne– Gestion de la taille

– Gestion de l’alignement

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 122 / 126

Un bilan sous forme de questions

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 123 / 126

• 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.

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 124 / 126

• 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 125 / 126

• À 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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan

Philippe Renevier Gonin - L3 Informatique Parcours Miage - POO - UI/Swing/Event - Semestre 6, 2017-2018 126 / 126

• É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

Présentation Générale Introduction Evénements Layout Images Events Graphiques Bilan