programmation ÉvÉnementielle - lifl.frcasiez/ihm/ctd/evenements.pdf · java fournit la classe...
Post on 25-Dec-2018
216 Views
Preview:
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
¨ 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
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
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
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
…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é
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
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
top related