SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
Jean-Baptiste.Yunes@univ-paris-diderot.fr	

Université Paris Diderot	

©2014
Interfaces Graphiques	

Interactivité : événements et actions
Événements
• Les composants Swing permettent (en général) à
l’utilisateur d’agir sur l’application	

• pour cela ils effectuent une série de gestes depuis
les périphériques, lesquels sont interprétés
comme actions logiques	

• gestes : événements bruts, bas-niveau	

• actions : événements logiques, sémantiques
2
Événements
• Une sollicitation depuis un composant (source)	

• provoque la création d’un événement (event)	

• lequel est distribué aux parties fonctionnelles de
traitement (listener)	

• découplage entre interface et métier
3
Extrait du tutoriel Swing
Événements
• Ceci nécessite qu’un Listener s’enregistre auprès
d’une source	

• mécanisme de rappel (callback)	

• « Tiens voilà mon numéro de téléphone, comme
ça tu pourras me prévenir plus tard »	

!
• Attention : lors du rappel, soyez rapide!	

• ne faites pas traîner la conversation car le rappel
est effectué dans le même Thread que celui qui
gère les événements	

• sinon SwingWorker (voir plus tard…)
4
Composants et événements
• Chaque composant Swing peut générer des
événements	

• deux catégories :	

• les événements génériques aux composants
Swing	

• les événements spécifiques (relatifs à la
sémantique de l’objet graphique)
5
Événements génériques
• Les événements génériques (principaux) :	

• ComponentEvent (taille, position, visibilité)	

• FocusEvent (capture le clavier ou non)	

• KeyEvent (frappe clavier)	

• MouseEvent (action souris)	

• MouseMotionEvent (action souris)
6
ActionEvent
• JButton, JMenuItem, JToggleButton,
JRadioButton, JTextField, JPasswordField,
JComboBox, JCheckBox, JFormattedTextField	

•ActionEvent!
• représente l’action logique (clic sur le bouton,
choix de l’option, saisie du champ, etc)	

• attention : action logique	

• i.e. : le clic peut-être obtenu par un
raccourci par exemple…
7
ActionListener
• pour qu’un objet reçoive un ActionEvent	

• il faut qu’il implémente l’interface	

•ActionListener!
•public void
actionPerformed(ActionEvent)!
• méthode appelée si l’objet est enregistré
auprès d’une source possible	

•addActionListener(ActionListener)!
• et lorsqu’on déclenche par actions physiques
l’action logique (clic sur un bouton par ex.))
8
ActionListener / ActionEvent
public class MaClasseDEcouteur implements ActionListener {
…
public void actionPerformed(ActionEvent e) {
// code exécuté si l’instance est enregistrée
// et si l’utilisateur déclenche l’Action
}
…
}
!
JButton monComposant = new JButton(“un bouton“);
…
instanceDeMaClasseEcouteur = new MaClasseDEcouteur();
// enregistrement d’un écouteur sur un composant
// susceptible de générer une Action
monComposant.addActionListener(instanceDeMaClasseDEcouteur);
…
!
9
Source / Listener
• puisqu’un Listener peut recevoir un événement
provenant de différentes Sources	

• comment distinguer la source ?	

• la classe EventObject (super-classe des
événéments) fournit la méthode	

•Object getSource()
10
Source / Listener
public class MaClasseDEcouteur implements ActionListener {!
…!
public void actionPerformed(ActionEvent e) {!
if (e.getSource()== monComposant) { ... }!
if (e.getSource()== monAutreComposant) { ... }!
}!
…!
}!
!
!
…!
instanceDeMaClasseEcouteur = new MaClasseDEcouteur();!
// enregistrement d’un écouteur sur un composant!
// susceptible de générer une Action!
monComposant.addActionListener(instanceDeMaClasseDEcouteur);!
monAutreComposant.addActionListener(instanceDeMaClasseDEcouteur);!
…!
!
11
Source / Listener
• utiliser une commande associée :	

• une chaîne de caractère portée par la Source et
qui permet au Listener de réaliser des variantes
de traitement	

• avantages	

• c’est la Source qui décide quelle variante elle
veut obtenir	

• une Source peut facilement changer de rôle	

•String getActionCommand()!
•setActionCommand(String)
12
Source / Listener
public class MaClasseEcouteur implements ActionListener {!
private void save() { ... }!
private void quit() { ... }!
public void actionPerformed(ActionEvent e) {!
if (e.getActionCommand().equals(“save and quit“)) {!
save();!
quit();!
}!
if (e.getActionCommand().equals(“quit“)) {!
quit();!
}!
}!
}!
!
...!
instanceDeMaClasseEcouteur = new MaClasseEcouteur();!
JButton b = new JButton(“Quitter“);!
b.setActionCommand(“quit“);!
b.addActionListener(instanceDeMaClasseEcouteur);!
...
13
Action
• si plusieurs composants servent à déclencher une
même action	

• comment les paramétrer facilement ?	

• réifier totalement la notion d’Action	

• interface Action / classe AbstractAction	

• c’est une implémentation du design pattern
Command
14
Action
15
Source : wikipédia
Action
• une Action (sous-interface de ActionListener)
doit répondre à différentes méthodes	

• actionPerformed évidemment	

• en particulier doit permettre d’y associer/
retrouver des valeurs associées à des clés	

• c’est une mémoire associative	

• les composants concernés peuvent y
retrouver ce dont ils ont besoin (icône, texte,
etc)
16
• Clés	

•ACCELERATOR_KEY!
•ACTION_COMMAND_KEY!
•DEFAULT!
•DISPLAYED_MNEMONIC_INDEX_KEY!
•LARGE_ICON_KEY!
•LONG_DESCRIPTION!
•MNEMONIC_KEY!
•NAME!
•SELECTED_KEY!
•SHORT_DESCRIPTION!
•SMALL_ICON
17
Source / Listener
public class Quitter extends AbstractAction {!
public Quitter() {!
putValue(Action.SHORT_DESCRIPTION,!
“Quitter l’application“);!
putValue(Action.NAME,“Quitter“);!
}!
public void actionPerformed(ActionEvent e) {!
// fait quelque chose pour quitter l’application!
System.exit(0);!
}!
}!
!
...!
// instanciation d’une action pour quitter!
Quitter q = new Quitter();!
!
// un bouton qui occasionnera l’action de quitter!
JButton b = new JButton(q);!
...
18
ActionExemple.java
KeyListener
• Il peut être utile de recevoir des événements en
provenance du clavier	

• interface KeyListener	

• Enregistrement d’un tel écouteur sur un composant	

•addKeyListener(KeyListener)
19
KeyListener
!
• deux types d’événements :	

• la saisie d’un caractère (Unicode)	

•keyTyped(KeyEvent)!
• l’appui et le relâchement d’une touche	

•keyPressed(KeyEvent)!
•keyReleased(KeyEvent)
20
KeyEvent
•KeyEvent!
• char getKeyChar() pour récupérer un
caractère Unicode ou CHAR_UNDEFINED	

• int getKeyCode() pour récupérer la
touche clavier	

• renvoie un code VK_*	

• VK_A, VK_ENTER, VK_END, VK_F1,
VK_PAGE_DOWN...
21
MouseListener / MouseMotionListener / MouseWheelListener
• Les événements provenants de la souris sont classés
en 3 catégories :	

• les clics	

• les plus ordinaires	

• les déplacements	

• nécessitent une attention particulière car ils
peuvent être très nombreux	

• la rotation de la roue	

• dont la gestion est particulière
22
MouseListener
• Les clics	

• interface MouseListener	

• addMouseListener(MouseListener) de la
classe Component	

• 5 méthodes
23
MouseListener
•mouseClicked(MouseEvent)!
•mousePressed(MouseEvent)!
•mouseReleased(MouseEvent)!
•mouseEntered(MouseEvent)!
• lorsque la souris entre dans l’espace du
composant	

•mouseExited(MouseEvent)!
• lorsque la souris sort de l’espace du composant
24
MouseEvent
•int getButton()!
•MouseEvent.BUTTON1!
•MouseEvent.BUTTON2!
•MouseEvent.BUTTON3!
•int getClickCount()!
• multi-clic	

• int getX(), int getY()!
• guess what ?
25
MouseListenerExample.java
MouseMotionListener
• les déplacements de la souris	

• ne doivent être interceptés que lorsque c’est
strictement utile	

• le nombre d’événements générés peut être
important	

• appels très nombreux des callbacks...	

• en général on attend l’appui sur un bouton pour
démarrer la réception	

• puis on arrête d’écouter en relâchant un bouton
26
MouseMotionListener
• les déplacements de la souris	

• interface MouseMotionListener	

• addMouseMotionListener dans les composants	

• avec bouton maintenu	

•mouseDragged(MouseEvent)!
• sans bouton maintenu	

•mouseMoved(MouseEvent)
27
MouseMotionListenerExample.java
MouseWheelListener
• aucun moyen de savoir si une souris est équipée
d’une roue	

• interface MouseWheelListener	

• addMouseWheelListener des composants	

• méthode mouseWheelMoved(MouseWheelEvent)	

• attention, événement particulier
MouseWheelEvent
28
MouseWheelEvent
•int getScrollAmount()!
• nombre d’unités par clic de roue	

•int getScrollType()!
• deux types : WHEEL_UNIT_SCROLL,
WHEEL_BLOCK_SCROLL	

•int getUnitsToScroll()!
• nombre d’unités totales à scroller
(amount*rotation)	

•int getWheelRotation()!
• nombre de clics de la roue
29
MouseWheelListener.java
MVC
• Comment obtenir un bon découplage entre la partie
métier et l’interface	

• le motif conceptuel MVC	

• Modèle / Vue / Contrôleur
30
extrait de Microsoft.com
Le MVC passif
• Le modèle est conçu indépendamment de l’interface	

• Le contrôleur reçoit des événements et modifie en
conséquence le modèle, puis prévient les vues de se
remettre à jour	

• La vue, sur réquisition du contrôleur, récupère les
données intéressantes du modèle et les présentent à
l’interface
31
extrait de Microsoft.com
PassiveMVC.java
Le MVC actif
• Problème : le modèle peut se mettre à jour de lui-
même ou par un autre biais	

• On utilise alors le pattern Observer
32
extrait de Microsoft.com
extrait de Microsoft.com
ActiveMVC.java

Weitere ähnliche Inhalte

Andere mochten auch

Taller de elab de instrumentos de evaluacio pruebas1
Taller de elab  de   instrumentos de evaluacio pruebas1Taller de elab  de   instrumentos de evaluacio pruebas1
Taller de elab de instrumentos de evaluacio pruebas1Adalberto
 
La population
La populationLa population
La populationjlealleon
 
Startup Weekend Lyon
Startup Weekend LyonStartup Weekend Lyon
Startup Weekend LyonHenri Morlaye
 
Stalingrad
StalingradStalingrad
Stalingradmalcazar
 
2011 calendario
2011 calendario2011 calendario
2011 calendarioAdalberto
 
Stratégies d'influence, le décryptage de François-Bernard Huyghe.
Stratégies d'influence, le décryptage de François-Bernard Huyghe.Stratégies d'influence, le décryptage de François-Bernard Huyghe.
Stratégies d'influence, le décryptage de François-Bernard Huyghe.Bruno Racouchot
 
AcosStat n°180 - Octobre 2013
AcosStat n°180 - Octobre 2013AcosStat n°180 - Octobre 2013
AcosStat n°180 - Octobre 2013Nathalie SALLES
 
Beuchat présentation historique fr
Beuchat présentation historique frBeuchat présentation historique fr
Beuchat présentation historique frBeuchatInternational
 
Le Soleil Qui Brille Hors De Lozovo
Le Soleil Qui Brille Hors De  LozovoLe Soleil Qui Brille Hors De  Lozovo
Le Soleil Qui Brille Hors De LozovoSvetlana Stojkova
 
Supplement catalogue batiment 2012 CAE GROUPE
Supplement catalogue batiment 2012 CAE GROUPESupplement catalogue batiment 2012 CAE GROUPE
Supplement catalogue batiment 2012 CAE GROUPECAE GROUPE
 
Monster beats in ear
Monster beats in earMonster beats in ear
Monster beats in earoutletonline
 
Formation Comundi : Démarrer en tant qu'auto-entrepneur
Formation Comundi : Démarrer en tant qu'auto-entrepneurFormation Comundi : Démarrer en tant qu'auto-entrepneur
Formation Comundi : Démarrer en tant qu'auto-entrepneurJohan lio
 

Andere mochten auch (20)

Taller de elab de instrumentos de evaluacio pruebas1
Taller de elab  de   instrumentos de evaluacio pruebas1Taller de elab  de   instrumentos de evaluacio pruebas1
Taller de elab de instrumentos de evaluacio pruebas1
 
La population
La populationLa population
La population
 
Startup Weekend Lyon
Startup Weekend LyonStartup Weekend Lyon
Startup Weekend Lyon
 
Doc114374
Doc114374Doc114374
Doc114374
 
Presentació ies narcís_oller
Presentació ies narcís_ollerPresentació ies narcís_oller
Presentació ies narcís_oller
 
Stalingrad
StalingradStalingrad
Stalingrad
 
2011 calendario
2011 calendario2011 calendario
2011 calendario
 
La gran motivacion
La gran motivacionLa gran motivacion
La gran motivacion
 
Evaluación por competencias (fph)
Evaluación por competencias (fph)Evaluación por competencias (fph)
Evaluación por competencias (fph)
 
Mes tisanes
Mes tisanesMes tisanes
Mes tisanes
 
Stratégies d'influence, le décryptage de François-Bernard Huyghe.
Stratégies d'influence, le décryptage de François-Bernard Huyghe.Stratégies d'influence, le décryptage de François-Bernard Huyghe.
Stratégies d'influence, le décryptage de François-Bernard Huyghe.
 
AcosStat n°180 - Octobre 2013
AcosStat n°180 - Octobre 2013AcosStat n°180 - Octobre 2013
AcosStat n°180 - Octobre 2013
 
Pinterest _ Mars 2012
Pinterest _ Mars 2012Pinterest _ Mars 2012
Pinterest _ Mars 2012
 
Beuchat présentation historique fr
Beuchat présentation historique frBeuchat présentation historique fr
Beuchat présentation historique fr
 
9_Grece_2012
9_Grece_20129_Grece_2012
9_Grece_2012
 
La réforme du classement des hébergements
La réforme du classement des hébergementsLa réforme du classement des hébergements
La réforme du classement des hébergements
 
Le Soleil Qui Brille Hors De Lozovo
Le Soleil Qui Brille Hors De  LozovoLe Soleil Qui Brille Hors De  Lozovo
Le Soleil Qui Brille Hors De Lozovo
 
Supplement catalogue batiment 2012 CAE GROUPE
Supplement catalogue batiment 2012 CAE GROUPESupplement catalogue batiment 2012 CAE GROUPE
Supplement catalogue batiment 2012 CAE GROUPE
 
Monster beats in ear
Monster beats in earMonster beats in ear
Monster beats in ear
 
Formation Comundi : Démarrer en tant qu'auto-entrepneur
Formation Comundi : Démarrer en tant qu'auto-entrepneurFormation Comundi : Démarrer en tant qu'auto-entrepneur
Formation Comundi : Démarrer en tant qu'auto-entrepneur
 

Ähnlich wie De l'interactivité avec les Listeners

Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Farouk Mezghich
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Automatiser les tests d'acceptation : comment s'y prendre ?
Automatiser les tests d'acceptation : comment s'y prendre ?Automatiser les tests d'acceptation : comment s'y prendre ?
Automatiser les tests d'acceptation : comment s'y prendre ?Vincent Tencé
 
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent TencéAutomatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent TencéAgile Montréal
 
Spring Batch 17-05-2011
Spring Batch 17-05-2011Spring Batch 17-05-2011
Spring Batch 17-05-2011Normandy JUG
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidHoussem Lahiani
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidHoussem Lahiani
 
Android Lab Test : Le capteur gyroscope (français)
Android Lab Test : Le capteur gyroscope (français)Android Lab Test : Le capteur gyroscope (français)
Android Lab Test : Le capteur gyroscope (français)Bruno Delb
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsCocoaHeads France
 
Hacking your home
Hacking your homeHacking your home
Hacking your homelaurenthuet
 
Industrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPIndustrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPhalleck45
 
À la découverte des observables
À la découverte des observablesÀ la découverte des observables
À la découverte des observablesNicolas Carlo
 
Seance8_Programmation_Interfaces_Graphiques_Gestion_Evenements.pptx
Seance8_Programmation_Interfaces_Graphiques_Gestion_Evenements.pptxSeance8_Programmation_Interfaces_Graphiques_Gestion_Evenements.pptx
Seance8_Programmation_Interfaces_Graphiques_Gestion_Evenements.pptxThomasNOEL15
 
Chapitre4_ConceptionDynamique (1).pptx
Chapitre4_ConceptionDynamique (1).pptxChapitre4_ConceptionDynamique (1).pptx
Chapitre4_ConceptionDynamique (1).pptxfatmaezzahranouioui
 

Ähnlich wie De l'interactivité avec les Listeners (20)

Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)
 
JavaSwing.pdf
JavaSwing.pdfJavaSwing.pdf
JavaSwing.pdf
 
Patron observer
Patron observerPatron observer
Patron observer
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
5.ateliers avancés
5.ateliers avancés5.ateliers avancés
5.ateliers avancés
 
Automatiser les tests d'acceptation : comment s'y prendre ?
Automatiser les tests d'acceptation : comment s'y prendre ?Automatiser les tests d'acceptation : comment s'y prendre ?
Automatiser les tests d'acceptation : comment s'y prendre ?
 
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent TencéAutomatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé
 
Aspectj
AspectjAspectj
Aspectj
 
Spring Batch 17-05-2011
Spring Batch 17-05-2011Spring Batch 17-05-2011
Spring Batch 17-05-2011
 
Swing
SwingSwing
Swing
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'Android
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'Android
 
Android Lab Test : Le capteur gyroscope (français)
Android Lab Test : Le capteur gyroscope (français)Android Lab Test : Le capteur gyroscope (français)
Android Lab Test : Le capteur gyroscope (français)
 
cour-DOM-Partie6.pdf
cour-DOM-Partie6.pdfcour-DOM-Partie6.pdf
cour-DOM-Partie6.pdf
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
 
Hacking your home
Hacking your homeHacking your home
Hacking your home
 
Industrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPIndustrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHP
 
À la découverte des observables
À la découverte des observablesÀ la découverte des observables
À la découverte des observables
 
Seance8_Programmation_Interfaces_Graphiques_Gestion_Evenements.pptx
Seance8_Programmation_Interfaces_Graphiques_Gestion_Evenements.pptxSeance8_Programmation_Interfaces_Graphiques_Gestion_Evenements.pptx
Seance8_Programmation_Interfaces_Graphiques_Gestion_Evenements.pptx
 
Chapitre4_ConceptionDynamique (1).pptx
Chapitre4_ConceptionDynamique (1).pptxChapitre4_ConceptionDynamique (1).pptx
Chapitre4_ConceptionDynamique (1).pptx
 

De l'interactivité avec les Listeners

  • 2. Événements • Les composants Swing permettent (en général) à l’utilisateur d’agir sur l’application • pour cela ils effectuent une série de gestes depuis les périphériques, lesquels sont interprétés comme actions logiques • gestes : événements bruts, bas-niveau • actions : événements logiques, sémantiques 2
  • 3. Événements • Une sollicitation depuis un composant (source) • provoque la création d’un événement (event) • lequel est distribué aux parties fonctionnelles de traitement (listener) • découplage entre interface et métier 3 Extrait du tutoriel Swing
  • 4. Événements • Ceci nécessite qu’un Listener s’enregistre auprès d’une source • mécanisme de rappel (callback) • « Tiens voilà mon numéro de téléphone, comme ça tu pourras me prévenir plus tard » ! • Attention : lors du rappel, soyez rapide! • ne faites pas traîner la conversation car le rappel est effectué dans le même Thread que celui qui gère les événements • sinon SwingWorker (voir plus tard…) 4
  • 5. Composants et événements • Chaque composant Swing peut générer des événements • deux catégories : • les événements génériques aux composants Swing • les événements spécifiques (relatifs à la sémantique de l’objet graphique) 5
  • 6. Événements génériques • Les événements génériques (principaux) : • ComponentEvent (taille, position, visibilité) • FocusEvent (capture le clavier ou non) • KeyEvent (frappe clavier) • MouseEvent (action souris) • MouseMotionEvent (action souris) 6
  • 7. ActionEvent • JButton, JMenuItem, JToggleButton, JRadioButton, JTextField, JPasswordField, JComboBox, JCheckBox, JFormattedTextField •ActionEvent! • représente l’action logique (clic sur le bouton, choix de l’option, saisie du champ, etc) • attention : action logique • i.e. : le clic peut-être obtenu par un raccourci par exemple… 7
  • 8. ActionListener • pour qu’un objet reçoive un ActionEvent • il faut qu’il implémente l’interface •ActionListener! •public void actionPerformed(ActionEvent)! • méthode appelée si l’objet est enregistré auprès d’une source possible •addActionListener(ActionListener)! • et lorsqu’on déclenche par actions physiques l’action logique (clic sur un bouton par ex.)) 8
  • 9. ActionListener / ActionEvent public class MaClasseDEcouteur implements ActionListener { … public void actionPerformed(ActionEvent e) { // code exécuté si l’instance est enregistrée // et si l’utilisateur déclenche l’Action } … } ! JButton monComposant = new JButton(“un bouton“); … instanceDeMaClasseEcouteur = new MaClasseDEcouteur(); // enregistrement d’un écouteur sur un composant // susceptible de générer une Action monComposant.addActionListener(instanceDeMaClasseDEcouteur); … ! 9
  • 10. Source / Listener • puisqu’un Listener peut recevoir un événement provenant de différentes Sources • comment distinguer la source ? • la classe EventObject (super-classe des événéments) fournit la méthode •Object getSource() 10
  • 11. Source / Listener public class MaClasseDEcouteur implements ActionListener {! …! public void actionPerformed(ActionEvent e) {! if (e.getSource()== monComposant) { ... }! if (e.getSource()== monAutreComposant) { ... }! }! …! }! ! ! …! instanceDeMaClasseEcouteur = new MaClasseDEcouteur();! // enregistrement d’un écouteur sur un composant! // susceptible de générer une Action! monComposant.addActionListener(instanceDeMaClasseDEcouteur);! monAutreComposant.addActionListener(instanceDeMaClasseDEcouteur);! …! ! 11
  • 12. Source / Listener • utiliser une commande associée : • une chaîne de caractère portée par la Source et qui permet au Listener de réaliser des variantes de traitement • avantages • c’est la Source qui décide quelle variante elle veut obtenir • une Source peut facilement changer de rôle •String getActionCommand()! •setActionCommand(String) 12
  • 13. Source / Listener public class MaClasseEcouteur implements ActionListener {! private void save() { ... }! private void quit() { ... }! public void actionPerformed(ActionEvent e) {! if (e.getActionCommand().equals(“save and quit“)) {! save();! quit();! }! if (e.getActionCommand().equals(“quit“)) {! quit();! }! }! }! ! ...! instanceDeMaClasseEcouteur = new MaClasseEcouteur();! JButton b = new JButton(“Quitter“);! b.setActionCommand(“quit“);! b.addActionListener(instanceDeMaClasseEcouteur);! ... 13
  • 14. Action • si plusieurs composants servent à déclencher une même action • comment les paramétrer facilement ? • réifier totalement la notion d’Action • interface Action / classe AbstractAction • c’est une implémentation du design pattern Command 14
  • 16. Action • une Action (sous-interface de ActionListener) doit répondre à différentes méthodes • actionPerformed évidemment • en particulier doit permettre d’y associer/ retrouver des valeurs associées à des clés • c’est une mémoire associative • les composants concernés peuvent y retrouver ce dont ils ont besoin (icône, texte, etc) 16
  • 18. Source / Listener public class Quitter extends AbstractAction {! public Quitter() {! putValue(Action.SHORT_DESCRIPTION,! “Quitter l’application“);! putValue(Action.NAME,“Quitter“);! }! public void actionPerformed(ActionEvent e) {! // fait quelque chose pour quitter l’application! System.exit(0);! }! }! ! ...! // instanciation d’une action pour quitter! Quitter q = new Quitter();! ! // un bouton qui occasionnera l’action de quitter! JButton b = new JButton(q);! ... 18 ActionExemple.java
  • 19. KeyListener • Il peut être utile de recevoir des événements en provenance du clavier • interface KeyListener • Enregistrement d’un tel écouteur sur un composant •addKeyListener(KeyListener) 19
  • 20. KeyListener ! • deux types d’événements : • la saisie d’un caractère (Unicode) •keyTyped(KeyEvent)! • l’appui et le relâchement d’une touche •keyPressed(KeyEvent)! •keyReleased(KeyEvent) 20
  • 21. KeyEvent •KeyEvent! • char getKeyChar() pour récupérer un caractère Unicode ou CHAR_UNDEFINED • int getKeyCode() pour récupérer la touche clavier • renvoie un code VK_* • VK_A, VK_ENTER, VK_END, VK_F1, VK_PAGE_DOWN... 21
  • 22. MouseListener / MouseMotionListener / MouseWheelListener • Les événements provenants de la souris sont classés en 3 catégories : • les clics • les plus ordinaires • les déplacements • nécessitent une attention particulière car ils peuvent être très nombreux • la rotation de la roue • dont la gestion est particulière 22
  • 23. MouseListener • Les clics • interface MouseListener • addMouseListener(MouseListener) de la classe Component • 5 méthodes 23
  • 24. MouseListener •mouseClicked(MouseEvent)! •mousePressed(MouseEvent)! •mouseReleased(MouseEvent)! •mouseEntered(MouseEvent)! • lorsque la souris entre dans l’espace du composant •mouseExited(MouseEvent)! • lorsque la souris sort de l’espace du composant 24
  • 25. MouseEvent •int getButton()! •MouseEvent.BUTTON1! •MouseEvent.BUTTON2! •MouseEvent.BUTTON3! •int getClickCount()! • multi-clic • int getX(), int getY()! • guess what ? 25 MouseListenerExample.java
  • 26. MouseMotionListener • les déplacements de la souris • ne doivent être interceptés que lorsque c’est strictement utile • le nombre d’événements générés peut être important • appels très nombreux des callbacks... • en général on attend l’appui sur un bouton pour démarrer la réception • puis on arrête d’écouter en relâchant un bouton 26
  • 27. MouseMotionListener • les déplacements de la souris • interface MouseMotionListener • addMouseMotionListener dans les composants • avec bouton maintenu •mouseDragged(MouseEvent)! • sans bouton maintenu •mouseMoved(MouseEvent) 27 MouseMotionListenerExample.java
  • 28. MouseWheelListener • aucun moyen de savoir si une souris est équipée d’une roue • interface MouseWheelListener • addMouseWheelListener des composants • méthode mouseWheelMoved(MouseWheelEvent) • attention, événement particulier MouseWheelEvent 28
  • 29. MouseWheelEvent •int getScrollAmount()! • nombre d’unités par clic de roue •int getScrollType()! • deux types : WHEEL_UNIT_SCROLL, WHEEL_BLOCK_SCROLL •int getUnitsToScroll()! • nombre d’unités totales à scroller (amount*rotation) •int getWheelRotation()! • nombre de clics de la roue 29 MouseWheelListener.java
  • 30. MVC • Comment obtenir un bon découplage entre la partie métier et l’interface • le motif conceptuel MVC • Modèle / Vue / Contrôleur 30 extrait de Microsoft.com
  • 31. Le MVC passif • Le modèle est conçu indépendamment de l’interface • Le contrôleur reçoit des événements et modifie en conséquence le modèle, puis prévient les vues de se remettre à jour • La vue, sur réquisition du contrôleur, récupère les données intéressantes du modèle et les présentent à l’interface 31 extrait de Microsoft.com PassiveMVC.java
  • 32. Le MVC actif • Problème : le modèle peut se mettre à jour de lui- même ou par un autre biais • On utilise alors le pattern Observer 32 extrait de Microsoft.com extrait de Microsoft.com ActiveMVC.java