programmation ÉvÉnementielle - lifl.frcasiez/ihm/ctd/evenements.pdf · java fournit la classe...

43
PROGRAMMATION ÉVÉNEMENTIELLE Géry Casiez http://www.lifl.fr/~casiez IHM Master 1 informatique - Université de Lille 1 1

Upload: vankhue

Post on 25-Dec-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

PROGRAMMATION ÉVÉNEMENTIELLEGéry Casiez http://www.lifl.fr/~casiezIHM Master 1 informatique - Université de Lille 1

1

Programmation événementielle

¨ Programmation « procédurale »¤ Le déroulement est contrôlé par une séquence

d’instructions écrites¤ Le programmeur écrit la boucle principaleProgramme principal initialisations répéter lire une commande traiter une commande jusqu’à la commande finir

2

Programmation événementielle

¨ Le déroulement est contrôlé par la survenue d’événements (dont les actions de l’utilisateur)

¨ Pas de boucle principale (elle est enfouie dans la bibliothèque)Fonctions (réaction aux événements)Programme principal initialisations

3

Programmation événementielle

¨ Événements liés aux périphériques¤ Entrée/sortie du curseur dans une fenêtre¤ Utilisation d’un des boutons de la souris¤ Frappe au clavier¤ Sélection d’un item dans une liste déroulante¤ …

¨ Événements liés aux applications¤ Création/destruction de fenêtres¤ Réaffichage¤ …

4

Programmation événementielle

¨ Boucle principale de gestion des événements (enfouie dans la librairie)¤ Initialisation

while () { attendre événement suivant E traiter évènement E}

5

Programmation événementielle

¨ Exemple: JRE Windows6

Programmation événementielle7

Programmation événementielle

¨ Les événements sont placés dans une queue (FIFO)¨ La boucle de gestion des événements prend les

événements dans la queue et les traite¤ Mouse Move (10,15)

Mouse Down Left (3,40)Mouse Up Left (10, 50)

JRE ->

JDK ->

8

Programmation événementielle

¨ L’Event Dispatching Thread (EDT) prend les événements dans la queue et les envoie aux composants

9

Event Dispatching Thread

¨ Attention, les événements de mise à jour de l’affichage sont également gérés par l’EDT

10

Lien composant - application

¨ Fonctions de rappel (callbacks)¤ Enregistrées dans le composant à sa création

(abonnement)

¤ Appelées lorsque l’une des opérations du composant est activée (notification)

¨ Utilisation du patron de conception Observateur

11

Patron de conception Observateur

¨ Appelé également Observer / Observable¨ Plusieurs acteurs: le sujet et les observateurs¨ Ce patron permet à un ensemble d’objets de

s’abonner à un sujet pour recevoir automatiquement des notifications chaque fois que ce sujet change d’état

¨ Objectif: augmenter la réutilisabilité en diminuant le couplage entre les classes

12

Patron de conception Observateur

¨ Listes des observateurs = liste de dépendants¨ Nombre et nature pas forcément connus à la

compilation¨ Exemple: la table et les graphiques dépendent du

modèle

13

Patron de conception Observateur

¨ Le sujet est une classe abstraite qui fournit une interface pour attacher et détacher des observateurs ainsi que les notifier

Pull model: l’observateur doit extraire les informations du sujet

14

Patron de conception Observateur

Alternative: push-model: toute l’information est envoyée lors de l’update. Pas d’utilisation de getState()

15

En java…

¨ Java fournit la classe Observable et l’interface Observer

16

Swing et les événements

¨ Les événements sont représentés par des objets qui fournissent des informations sur l’événement lui même et sur l’objet à l’origine de cet événement

¨ Il existe des classes d’événements spécifiques pour chaque type d’interaction avec l’utilisateur

17

Swing et les événements

¨ L’événement généré dépend de la nature physique de l’interaction et surtout de sa signification logique: le type d’objet événement généré n’est pas le même s’il s’agit d’un clic sur un bouton, d’un clic pour sélectionner un menu ou d’un clic pour se positionner dans un champ de saisie de texte

18

Classes d’événements19

Swing et les événements

¨ MouseEvent: actions discrètes de la souris¨ MouseMotionEvent: action continues sur la souris¨ FocusEvent: gain et perte du clavier¨ KeyEvent: actions sur le clavier¨ ActionEvent: pression d’un bouton, choix dans un

menu…¨ WindowEvent: événement survenant sur une fenêtre

20

Swing et les événements

¨ La classe à la base des événements: EventObject (java.util)

21

Classes d’événements

¨ Les événements ont comme caractéristique commune d’encapsuler des informations concernant leur contexte d’apparition:¤ Le composant graphique source (méthode getSource)¤ Les coordonnées du clic pour un MouseEvent¤ La valeur de la touche tapée pour un KeyEvent

22

Les Listeners

¨ A chaque classe d’événement correspond une interface pour le gérer: c’est le listener (observateur)

¨ Nécessité de s’abonner…¤ Public void addXXXXXListener(XXXXXListener l)

¨ … pour être ensuite notifié (appel de méthode)

23

Programmation événementielle sous Java

¨ Exemple: les événements souris sont notifiés par:¤ void mousePressed(MouseEvent e)¤ void mouseReleased(MouseEvent e)¤ void mouseClicked(MouseEvent e)¤ void mouseEntered(MouseEvent e)¤ void mouseMouseExited(MouseEvent e)

¨ Un auditeur d’événements souris s’enregistre par¤ void addMouseListener(MouseListener λ)

24

Exemple: clic sur un bouton

¨ Le clic sur un bouton correspond à la classe d’événement ActionEvent

¨ L’interface qui gère cet événement est ActionListener (Observateur)

¨ L’abonnement se fait par la méthode addActionListener de JButton (Sujet)

25

Exemple: clic sur un bouton26

…Listeners

¨ Nombreuses interfaces de type « …Listeners »¨ Identifier le composant qui va recevoir l’événement¨ Regarder la liste des méthodes addXXXXListeners

correspondantes

27

Où gérer les événements?

¨ Ecrire une classe qui implémente l’interface correspondante

¨ Exemple:¨ Possibilité d’utiliser les adapters pour ne pas avoir à

implémenter toutes les méthodes d’une interface¤ Ex: WindowListener -> WindowAdapter

¨ Inconvénient:¤ Nécessité de passer le ou les composants à modifier au

constructeur

28

Classes internes

¨ Classe définie à l’intérieur d’une autre¨ Intérêt: accès aux membres privés de la classe

englobante¨ Quand la classe n’est utilisée qu’une seule fois,

possibilité de la déclarer en tant que classe interne anonyme

29

Performance

¨ Swing gère l’affichage et les événements dans le même thread (l’EDT)

¨ Une méthode de gestion des événements lente peut bloquer l’interface

¨ Utilisation de threads pour les traitements longs

30

Retour sur MVC31

¨ Trois composantes:¤ Modèle : données de l’application¤ Vue : présentation, interface utilisateur¤ Contrôleur : traitements, logique de contrôle, gestion des

événements, synchronisation

Le MVC dans Swing32

¨ Swing n’applique pas à la lettre le patron de conception MVC

¨ Les composants Swing sont généralement implémentés de telle sorte que la vue et le contrôleur sont indissociables et sont regroupés dans un ComponentUI

¨ Le modèle reste séparé

Le MVC dans Swing33

¨ Un JComponent encapsule¤ Un ComponentUI¤ et un Model si cela a un sens

MVC et Swing34

¨ Modèle et multi-vues¤ Le Model d’un Jcomponent peut être exporté et partagé

avec celui d’un autre Jcomponent

¤ Exemple: JSlider et Jscrollbar: même modèle (Bounded Range Model). Si mise en commun du modèle, on a une synchronisation automatique

MVC et Swing35

¨ Dans l’API de Jslider:

¨ Changer le modèle du JSlider:

¨ On peut aussi ignorer l’existence des modèles

Vision du MVC selon Sun36

Pluggable Look and Feel37

¨ Le UIManager peut changer dynamiquement les ComponentUIs

Patron de conception stratégie

¨ Strategy en anglais¨ Permet de définir une famille d’algorithmes et de les

encapsuler de les façon à les rendre interchangeables

¨ Utilisé par le contrôleur

Patron de conception stratégie

Patron de conception stratégie

Exemple: contrôle de température

41

Exercice42

Exercice43