Programmation événementielle

Slides:



Advertisements
Présentations similaires
Les Cases Cachées 3 2 Les Verbes ER Tu/ manger Je/ parler Elles/
Advertisements

LES NOMBRES PREMIERS ET COMPOSÉS
[number 1-100].
Qualité du Premier Billot. 2 3 Défauts reliés à labattage.
1. Résumé 2 Présentation du créateur 3 Présentation du projet 4.
1 Swing par la pratique contrat Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique.
Gestion des événements (suite)
Les numéros
Cours MIAGE « Architectures Orientées Services » Henry Boccon-Gibod 1 Architectures Orientées Services Composants de Service Exemple pratique de développement.
Arbres Un premier exemple Contenu Rendu Ecouteurs Parcours
Composants graphiques de Java
Page 1 Les applets Jacques Lonchamp. Page 2 Présentation Une applet est téléchargée à partir dune machine distante qui fournit le code. Ce chargement.
Voisin-Polian : Introduction à Java 1 Introduction à Java - AWT - Frédéric VOISIN – Nicole POLIAN FIIFO - « Remise à Niveau »
La diapo suivante pour faire des algorithmes (colorier les ampoules …à varier pour éviter le « copiage ») et dénombrer (Entoure dans la bande numérique.
Vos premiers pas en Swing
2 1. Vos droits en tant quusagers 3 1. Vos droits en tant quusagers (suite) 4.
Injection de dépendances
Mr: Lamloum Med LES NOMBRES PREMIERS ET COMPOSÉS Mr: Lamloum Med.
Français I Leçon 2B Une semaine au lycée Au Debut #7 (for the dates of November 5 and 6) Please Translate the Following: 1. I love the math course. (Adorer.
Les couleurs, les chiffres 1-31, 40, 50 et les mois de l’année
CONCOURS DE CONAISSANCE 4 Français I Mars Il ________ la géographie (to learn).
BlueJ_XI 1 Java, les objets : tout de suite ! Gestion des erreurs : les exceptions Notes de cours associées au chapitre 11 tutorial BlueJ
1 Cours numéro 3 Graphes et informatique Définitions Exemple de modélisation Utilisation de ce document strictement réservée aux étudiants de l IFSIC.
Faculté I&C, Claude Petitpierre, André Maurer 1 Java.
Écouteurs de click d'une fenêtre
Langage Oriente Objet Cours 4.
La programmation objet Illustration de la POO en Pascal
1 Guide de lenseignant-concepteur Vincent Riff 27 mai 2003.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Classes abstraites et Interfaces
Historique de SystemC Regroupe 4 courants didées: SCENIC Project : Synopsys+UC Irvine Philips System-Level Data Types, VSIA SLD DWG IMEC, Hardware-Software.
Académie de Créteil - B.C Quest-ce quune Inscription 1)1 action + 1 stagiaire + 1 client 2)Parcours individuel (avec son Prix de Vente) 3)Un financement.
Interface graphiques.
F Copyright © Oracle Corporation, Tous droits réservés. Créer des programmes avec Procedure Builder.
LES NOMBRES PREMIERS ET COMPOSÉS
Graphical User Interface (GUI)
Le patron de conception « Strategy » Simon Durocher ( )
Graphical User Interface
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
JUnit Présentation complète de JUnit et « guide d’utilisation » en 13 transparents.
Tournoi de Flyball Bouin-Plumoison 2008 Tournoi de Flyball
Faculté I&C, Claude Petitpierre, André Maurer 1 Concepts dhéritage Héritage dimplémentation hasA Héritage de spécialisation isA.
Multi-Thread Jian-Yun Nie
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Badr Benmammar Formation Développeur Java Thread et Swing Badr Benmammar
Formation Développeur Java Applet et interfaces graphiques avec AWT
Java Swing.
Cours 11 Threads. Chapitre X threads threadPOO-L3 H. Fauconnier3 Threads threads: plusieurs activités qui coexistent et partagent des données exemples:
COURS DE PROGRAMMATION ORIENTEE OBJET :
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Équipe 2626 Octobre 2011 Jean Lavoie ing. M.Sc.A.
ECOLE DES HAUTES ETUDES COMMERCIALES MARKETING FONDAMENTAL
Traitement de différentes préoccupations Le 28 octobre et 4 novembre 2010.
Objectifs À la fin de ce cours, vous serez capables de :

CALENDRIER-PLAYBOY 2020.
LES PILES ET FILES.
Les Chiffres Prêts?
11/04/ L'héritage Cours 7 Cours 7.
To practice: Quantities Un, une, des, de Du, de la, de l’, de Le, la, l’, les.
Cours 7 Classes locales Clonage Divers: tableaux.
Cours 91 9 Interfaces graphiques avec awt. Cours 92 Plan Introduction : deux bibliothèques graphiques 1.Comment se dessine une fenêtre ?  Un exemple.
Interfaces graphiques. Composants d'interface utilisateur graphique (GUI) 1 Bibliothèques Awt et Swing Procédures communes pour l'utilisation de ces clases.
14 La gestion d’événements
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Introduction à la programmation objet avec java
 1) Il faut connaître le modèle et son fonctionnement  2) Définir le contrôle que l’on veut faire ouvrir, fermer, afficher, etc.) sur le modèle  3)
Java Swing. Principes de base  Des composants graphiques (exemple: JFrame, JButton …)  Hiérarchie de classes  Des événements et les actions à effectuer.
Transcription de la présentation:

Programmation événementielle

Programmation séquentielle Exécuter une application c’est exécuter la méthode main d’une des classes de l’application public static void main(String args[]) { Toto t = new Toto(); for (int i = 0; i < C.maxi; i ++) { t.f(i); } System.out.println("Fin"); } A la fin de l’exécution de main, l’application est terminée

Programmation événementielle public static void main(String args[]) { MaFenêtre f = new MaFenêtre(); } Crée une fenêtre graphique et l’affiche (via le constructeur) Et ensuite ? La méthode main est terminée mais pas l’application Exécuter une application c’est toujours exécuter la méthode main d’une classe, mais ce n’est pas tout ! Boucle d’ attente d’actions de l’utilisateur action  création d’un objet événement  traitement de l’événement par les objets intéressés

Parenthèse : bases sur les classes graphiques 2 bibliothèques graphiques AWT package java.awt (1ère bibliothèque) SWING package javax.swing dont les composants sont plus indépendants du système d’exploitation, et de plus haut niveau Ex : Frame remplacée par JFrame Button remplacé par JButton Dialog remplacée par JDialog … Ne pas mélanger composants AWT et SWING lorsque SWING donne une nouvelle version Les évenements de base restent définis par AWT : package java.awt.event

Object Objets ayant une apparence graphique et capables de réagir à des actions de l’utilisateur Classe racine des composants graphiques Component Composants conteneurs d’autres composants (méthode add) Button Container Composants SWING (sauf fenêtres) Window Fenêtres JComponent Frame Dialog JButton JPanel JFrame JDialog

Composants Container Comment sont placés les composants contenus dans un composant ? Principes : disposition dynamique s’adaptant aux modifications de dimensions du conteneur chaque conteneur possède un LayoutManager qui gère la disposition et la taille de ses composants chaque type de LayoutManager a ses propres règles Voir tutorial/TP 6, premières fenêtres graphiques BorderLayout FlowLayout

Le minimum pour commencer JFrame : « fenêtre cadre » ; classe de base de nos fenêtres La fenêtre contient un « panneau », instance de JPanel (ou d’une spécialisation de JPanel) Le panneau contient un seul bouton, instance de JButton

Problème Lorsque l’utilisateur actionne le bouton, le panneau doit prendre une couleur différente (par exemple, en boucle : noir, bleu, jaune, …) action action action action

public class FrameCouleur extends JFrame { private PanneauBouton panneau; public FrameCouleur() setSize(500, 400); setTitle("Histoire d'un bouton"); panneau = new PanneauBouton(); add(panneau); } public static void main(String args[]) { FrameCouleur f = new FrameCouleur(); f.setVisible(true);

public class PanneauBouton extends JPanel { private static Color [] tCol = {Color.black, Color.blue, Color.yellow}; private JButton b; public PanneauBouton() b = new JButton("Couleurs"); add(b); setBackground(Color.white); } Y’a plus qu’à … gérer l’action sur bouton

Gestion des événements Les événements sont des objets Objets sources d'événements : génèrent des événements en réponse à des actions de l’utilisateur ex: fenêtre, bouton, panneau… Objets écouteurs d'événements - s’inscrivent auprès d’objets sources - sont "avertis" lorsque les événements auxquels ils se sont inscrits sont générés Quel objet peut être écouteur ? A priori n'importe quel objet à condition que sa classe implémente une certaine interface

Bref rappel sur les interfaces idée : spécifie des entêtes de méthodes à implémenter ex : définir les opérations sur le type abstrait pile L'interface définit les méthodes qu'une classe doit implémenter pour être conforme à ce type abstrait Une classe peut déclarer qu'elle implémente une interface : elle doit alors concrétiser chaque méthode spécifiée dans l'interface (sauf si elle est abstraite, auquel cas elle peut ne pas implémenter toutes les méthodes de l’interface)

Exemple : événement "action sur bouton" Objet source d'événement b = new JButton("Couleurs"); Certains objets veulent être avertis des actions sur b, par ex: o b gère une liste des écouteurs d’événements de type « action » sur b  Il faut que o s’inscrive auprès de b b.addActionListener(o); //ajoute o comme écouteur des actions sur b

Lors d'une action sur le bouton : création d'un événement e de type ActionEvent pour chaque objet recensé dans la liste de b (donc o en particulier) une méthode est appelée o.actionPerformed(e) La classe de o doit donc posséder cette méthode :  ceci est assuré par le fait qu'elle implémente l'interface java.awt.event.ActionListener qui prévoit la méthode : public void actionPerformed(ActionEvent e)

La même chose avec des dessins … instance d'une classe qui implémente l'interface ActionListener b.addActionListener(o) écouteur o Bouton b L'écouteur s'enregistre auprès de l'objet source (et il ne peut le faire que s’il est instance d’une classe qui implémente l’interface appropriée)

l'utilisateur actionne le bouton Ce qui se passe lors d'une action sur le bouton o.actionPerformed(e) écouteur o Bouton b b : - crée un événement e - pour tout objet o de sa liste d’écouteurs d’action , appelle o.actionPerformed(e) exécute actionPerformed(e) …qui par exemple changera la couleur de fond du panneau

Action sur le bouton  le panneau change de couleur LA question : qui écoute? un objet de l'interface graphique un objet créé juste pour écouter Comment choisir?

L'écouteur doit être capable de traiter l'événement (ici : changer la couleur de fond de panneau) bouton... bof L'écouteur doit s'inscrire auprès de l'objet source (ici : le bouton) donc il doit connaître l'objet source, ou bien l'objet source doit le connaître fenêtre... bof Restent : le panneau ou un objet créé exprès

Solution 1 : Le panneau écoute public class PanneauBouton extends JPanel { private static Color [] tCol = {Color.black, Color.blue, Color.yellow}; private JButton b; public PanneauBouton() { b = new JButton("Couleurs"); add(b); setBackground(Color.white); } implements ActionListener private int numCol = -1; b.addActionListener(this); Que doit faire le panneau : (1) implémenter la bonne interface (2) s’enregistrer auprès du bouton public void actionPerformed(ActionEvent e) { } numCol = (numCol + 1) % tCol.length; setBackground(tCol[numCol]);

Solution 2 : Un écouteur d’une classe dédiée écoute public class PanneauBouton extends JPanel { private static Color [] tCol = {Color.black, Color.blue, Color.yellow}; private JButton b; public PanneauBouton() { b = new JButton("Couleurs"); add(b); setBackground(Color.white); } EcouteBouton ecout = new EcouteBouton(…); b.addActionListener(ecout); Que doit faire le panneau : (1) implémenter la bonne interface (2) s’enregistrer auprès du bouton

class EcouteBouton implements ActionListener { private static Color[] tCol = {Color.black, Color.blue, Color.yellow}; private int numCol = -1; private JPanel p; public EcouteBouton(JPanel p) { this.p = p; } public void actionPerformed(ActionEvent e) numCol = (numCol + 1) % tCol.length; p.setBackground(tCol[numCol]); }

X Retour à la classe PanneauBouton : public class PanneauBouton extends JPanel { private static Color [] tCol = {Color.black, Color.blue, Color.yellow}; private JButton b; public PanneauBouton() { b = new JButton("Couleurs"); add(b); setBackground(Color.white); } X EcouteBouton ecout = new EcouteBouton(this); b.addActionListener(ecout); Que doit faire le panneau : (1) implémenter la bonne interface (2) s’enregistrer auprès du bouton Finalement, on n’a pas besoin de nommer l’instance de EcouteBouton

Après avoir simplifié la classe PanneauBouton : public class PanneauBouton extends JPanel { private JButton b; public PanneauBouton() { b = new JButton("Couleurs"); add(b); setBackground(Color.white); } b.addActionListener(new EcouteBouton(this)); L’écouteur est ici un objet anonyme Que doit faire le panneau : (1) implémenter la bonne interface (2) s’enregistrer auprès du bouton On pourrait faire de la classe EcouteBouton une classe - interne à la classe PanneauBouton - et même une classe interne anonyme Mais ce sera pour le prochain cours …

Mécanisme général Différentes classes d'événements EventObject getSource() ActionEvent action sur un "bouton" (bouton, entrée de menu) WindowEvent changement d'état d'une fenêtre MouseEvent en provenance de la souris Différentes interfaces prévoyant des méthodes pour traiter certains types d'événements package java.awt.event

Interface ActionListener void actionPerformed(ActionEvent e) Interface MouseListener void mousePressed(MouseEvent e) void mouseReleased(MouseEvent e) void mouseClicked(MouseEvent e) void mouseEntered(MouseEvent e) void mouseExited(MouseEvent e)

Evénements de bas niveau / haut niveau Bas niveau : correspond à une action physique de l'utilisateur ex : un clic souris (MouseEvent) appui sur une touche (KeyEvent) Haut niveau : a été "interprété" une signification lui a été donnée ex : une action sur bouton (ActionEvent) peut-être due à des événenements de bas niveau différents : un clic souris ou appui de la touche "return"

Un objet qui peut être source d'événements possède une liste d'objets écouteurs (et même des listes) Lorsque le système l'avertit d'une certaine action : il génère un événement d'un certain type, il déclenche la méthode appropriée (prévue dans l'interface correspondante) sur tous les objets de cette liste en passant l'événement en paramètre

Exemple 2 : gérer des événements "souris" (dits "de bas niveau") Objet source : n'importe quel composant grahique 3 interfaces possibles pour les écouteurs : MouseListener MouseMotionListener MouseInputListener Evénement "souris" : instance de MouseEvent méthodes getX() et getY() [ coordonnées de la souris sur l’objet source, au moment de l’événement ]

Interface MouseListener void mousePressed(MouseEvent e) void mouseReleased(MouseEvent e) void mouseClicked(MouseEvent e) void mouseEntered(MouseEvent e) void mouseExited(MouseEvent e) Interface MouseMotionListener void mouseMoved(MouseEvent e) void mouseDragged(MouseEvent e) Interface MouseInputListener (depuis version 5) hérite des deux interfaces ci-dessus

Problème étant donnée une fenêtre contenant un panneau, réagir à certaines actions de la souris sur le panneau : souris pressée, souris relâchée, souris cliquée par un affichage dans la fenêtre console : type d'action au point x y

class Panneau extends JPanel { … } public class Fenetre extends JFrame { private JPanel pan; public Fenetre() { …………… pan = new Panneau(); add(pan); } …………… QUI écoute? Solution 1 : un objet instance d'une classe dédiée Solution 2 : le panneau ou la fenêtre

Solution 1. Ecouteur d'une classe dédiée class EcouteSouris implements MouseListener { public void mousePressed(MouseEvent e) { System.out.println("Souris pressée au pt " + e.getX() + ' '+ e.getY()); } } On implémente aussi mouseReleased et mouseClicked Mais aussi mouseEntered et mouseExited … avec un corps vide

On doit implémenter 5 méthodes alors 3 seulement nous intéressent... Notion de classe "adaptateur" : classe qui implémente l'interface avec un corps vide pour chaque méthode Il existe une classe adaptateur pour la plupart des interfaces qui spécifient plusieurs méthodes [voir documentation du SDK]

implements MouseListener

public abstract class MouseAdapter extends Object implements MouseListener An abstract adapter class for receiving mouse events. The methods in this class are empty. This class exists as convenience for creating listener objects. Mouse events let you track when a mouse is pressed, released, clicked, when it enters a component, and when it exits. (To track mouse moves and mouse drags, use the MouseMotionAdapter.) Extend this class to create a MouseEvent listener and override the methods for the events of interest. (If you implement the MouseListener interface, you have to define all of the methods in it. This abstract class defines null methods for them all, so you can only have to define methods for events you care about.)

MouseAdapter EcouteSouris MouseListener implements extends MouseListener implements EcouteSouris

class EcouteSouris extends MouseAdapter { redéfinition des 3 méthodes qui nous intéressent } class Panneau extends JPanel { … } public class Fenetre extends JFrame { private JPanel pan; public Fenetre() { …………… pan = new Panneau(); add(pan); EcouteSouris écout = new EcouteSouris(); pan.addMouseListener(écout); } }

Solution 2. La fenêtre ou le panneau écoute class Panneau extends JPanel { … } public class Fenetre extends JFrame { … } Pas d'héritage multiple entre classes les classes Fenêtre (dérivée de JFrame) et Panneau (dérivée de JPanel) ne peuvent donc dériver aussi de la classe MouseAdapter Il faut donc implémenter directement l’interface Ceci explique qu’on utilise assez rarement des composants graphiques comme écouteurs

class Panneau extends Jpanel { … } implements MouseListener { implémentation des 5 méthodes de l’interface } public class Fenetre extends JFrame { private JPanel pan; public Fenetre() { …………… pan = new Panneau(); add(pan); pan.addMouseListener(pan); } }

Prochain cours Classes internes anonymes pour la gestion d’événements Dessiner sur des composants graphiques + présentation du « gros » TP