Programmation des interfaces graphiques en Java : les événements Jean-Baptiste Vioix ([email protected]) IUT de Dijon-Auxerre - LE2I http://jb.vioix.free.fr 1-20 Principes des événements Généralités Principes des événements - Généralités La programmation par évènements est utilisée pour faire communiquer deux entités de manière non bloquante. Elle peut être utilisé pour échanger des données entre deux objets. L’objet qui émet un événement est nommé source. Un objet qui reçoit un évènement est un auditeur. Il est possible d’avoir plusieurs auditeurs pour une seule source. http://jb.vioix.free.fr 2-20 Principes des événements Généralités Principes des événements - Généralités La programmation par évènements est utilisée pour faire communiquer deux entités de manière non bloquante. Elle peut être utilisé pour échanger des données entre deux objets. L’objet qui émet un événement est nommé source. Un objet qui reçoit un évènement est un auditeur. Il est possible d’avoir plusieurs auditeurs pour une seule source. http://jb.vioix.free.fr 2-20 Principes des événements Généralités Principes des événements - Généralités La programmation par évènements est utilisée pour faire communiquer deux entités de manière non bloquante. Elle peut être utilisé pour échanger des données entre deux objets. L’objet qui émet un événement est nommé source. Un objet qui reçoit un évènement est un auditeur. Il est possible d’avoir plusieurs auditeurs pour une seule source. http://jb.vioix.free.fr 2-20 Principes des événements Généralités Principes des événements - Généralités La programmation par évènements est utilisée pour faire communiquer deux entités de manière non bloquante. Elle peut être utilisé pour échanger des données entre deux objets. L’objet qui émet un événement est nommé source. Un objet qui reçoit un évènement est un auditeur. Il est possible d’avoir plusieurs auditeurs pour une seule source. http://jb.vioix.free.fr 2-20 Principes des événements Généralités Principes des événements - Généralités La programmation par évènements est utilisée pour faire communiquer deux entités de manière non bloquante. Elle peut être utilisé pour échanger des données entre deux objets. L’objet qui émet un événement est nommé source. Un objet qui reçoit un évènement est un auditeur. Il est possible d’avoir plusieurs auditeurs pour une seule source. http://jb.vioix.free.fr 2-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java I Un évènement est un descendant de la classe EventObject. Cette classe n’a qu’un seul constructeur EventObject(Object source) qui permet d’initialiser le nom de la source. Elle implémente une méthode getSource qui permet d’identifier la source. Par convention, les évènements ont un nom du type XXXEvent. http://jb.vioix.free.fr 3-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java I Un évènement est un descendant de la classe EventObject. Cette classe n’a qu’un seul constructeur EventObject(Object source) qui permet d’initialiser le nom de la source. Elle implémente une méthode getSource qui permet d’identifier la source. Par convention, les évènements ont un nom du type XXXEvent. http://jb.vioix.free.fr 3-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java I Un évènement est un descendant de la classe EventObject. Cette classe n’a qu’un seul constructeur EventObject(Object source) qui permet d’initialiser le nom de la source. Elle implémente une méthode getSource qui permet d’identifier la source. Par convention, les évènements ont un nom du type XXXEvent. http://jb.vioix.free.fr 3-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java I Un évènement est un descendant de la classe EventObject. Cette classe n’a qu’un seul constructeur EventObject(Object source) qui permet d’initialiser le nom de la source. Elle implémente une méthode getSource qui permet d’identifier la source. Par convention, les évènements ont un nom du type XXXEvent. http://jb.vioix.free.fr 3-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java I Un évènement est un descendant de la classe EventObject. Cette classe n’a qu’un seul constructeur EventObject(Object source) qui permet d’initialiser le nom de la source. Elle implémente une méthode getSource qui permet d’identifier la source. Par convention, les évènements ont un nom du type XXXEvent. p u b l i c class M o n E v e n e m e n t e x t e n d s E v e n t O b j e c t { public MonEvenement ( Object source ) { super ( s o u r c e ); S y s t e m . out . p r i n t l n ( " L ’ e v e n e m e n t est cree ... " ); } } http://jb.vioix.free.fr 3-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java II Les auditeurs doivent implémenter une interface capable de recevoir cet évènement. Cette interface hérite de EventListener. Par convention l’interface est de la forme XXXListener. http://jb.vioix.free.fr 4-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java II Les auditeurs doivent implémenter une interface capable de recevoir cet évènement. Cette interface hérite de EventListener. Par convention l’interface est de la forme XXXListener. http://jb.vioix.free.fr 4-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java II Les auditeurs doivent implémenter une interface capable de recevoir cet évènement. Cette interface hérite de EventListener. Par convention l’interface est de la forme XXXListener. http://jb.vioix.free.fr 4-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java II Les auditeurs doivent implémenter une interface capable de recevoir cet évènement. Cette interface hérite de EventListener. Par convention l’interface est de la forme XXXListener. public interface MonEvenementListener extends EventListener { void M o n E v e n e m e n t O c c u r s ( M o n E v e n e m e n t e ); } http://jb.vioix.free.fr 4-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java III Pour utiliser cette interface, on construit une classe auditeur très simple. Elle affiche un message quand elle reçoit un évènement. http://jb.vioix.free.fr 5-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java III Pour utiliser cette interface, on construit une classe auditeur très simple. Elle affiche un message quand elle reçoit un évènement. http://jb.vioix.free.fr 5-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java III Pour utiliser cette interface, on construit une classe auditeur très simple. Elle affiche un message quand elle reçoit un évènement. p u b l i c class M a C l a s s e A u d i t e u r i m p l e m e n t s M o n E v e n e m e n t L i s t e n e r { p u b l i c void M o n E v e n e m e n t O c c u r s ( M o n E v e n e m e n t e ) { S y s t e m . out . p r i n t l n ( " J ’ ai recu un e v e n e m e n t de " + e . g e t S o u r c e ()); } } http://jb.vioix.free.fr 5-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java IV La source des évènements maintient un tableau des auditeurs. Normalement, elle propose une méthode pour ajouter un auditeur à la liste, retirer un auditeur de la liste. Quand la source veut envoyer un évènement, elle crée un objet MonEvenement puis l’envoie à tous les auditeurs. p u b l i c class M a S o u r c e { // ... p r i v a t e V e c t o r m o n E v e n e m e n t L i s t e n e r s = new V e c t o r (); // ... } http://jb.vioix.free.fr 6-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java IV La source des évènements maintient un tableau des auditeurs. Normalement, elle propose une méthode pour ajouter un auditeur à la liste, retirer un auditeur de la liste. Quand la source veut envoyer un évènement, elle crée un objet MonEvenement puis l’envoie à tous les auditeurs. p u b l i c class M a S o u r c e { // ... p r i v a t e V e c t o r m o n E v e n e m e n t L i s t e n e r s = new V e c t o r (); // ... p u b l i c s y n c h r o n i z e d void a j o u t e M o n E v e n e m e n t L i s t e n e r ( M o n E v e n e m e n t L i s t e n e r mel ){ if ( ! m o n E v e n e m e n t L i s t e n e r s . c o n t a i n s ( mel ) ) m o n E v e n e m e n t L i s t e n e r s . a d d E l e m e n t ( mel ) ; } // ... } http://jb.vioix.free.fr 6-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java IV La source des évènements maintient un tableau des auditeurs. Normalement, elle propose une méthode pour ajouter un auditeur à la liste, retirer un auditeur de la liste. Quand la source veut envoyer un évènement, elle crée un objet MonEvenement puis l’envoie à tous les auditeurs. p u b l i c class M a S o u r c e { // ... p r i v a t e V e c t o r m o n E v e n e m e n t L i s t e n e r s = new V e c t o r (); // ... p u b l i c s y n c h r o n i z e d void e n l e v e M o n E v e n e m e n t L i s t e n e r ( M o n E v e n e m e n t L i s t e n e r mel ){ if ( m o n E v e n e m e n t L i s t e n e r s . c o n t a i n s ( mel ) ) m o n E v e n e m e n t L i s t e n e r s . r e m o v e E l e m e n t ( mel ) ; } // ... } http://jb.vioix.free.fr 6-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java IV La source des évènements maintient un tableau des auditeurs. Normalement, elle propose une méthode pour ajouter un auditeur à la liste, retirer un auditeur de la liste. Quand la source veut envoyer un évènement, elle crée un objet MonEvenement puis l’envoie à tous les auditeurs. p u b l i c class M a S o u r c e { // ... p r i v a t e V e c t o r m o n E v e n e m e n t L i s t e n e r s = new V e c t o r (); // ... p u b l i c void e n v o i e M o n E v e n e m e n t (){ M o n E v e n e m e n t evt = new M o n E v e n e m e n t ( this ) ; for ( int i = 0 ; i < m o n E v e n e m e n t L i s t e n e r s . size (); i ++ ){ MonEvenementListener listener = ( MonEvenementListener ) monEvenementListeners . elementAt ( i ) ; l i s t e n e r . M o n E v e n e m e n t O c c u r s ( evt ) ; } } // ... } http://jb.vioix.free.fr 6-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java V Pour tester tous ces élèments, on construit une application très simple. La source est un objet de la classe MaSource, l’auditeur un objet de la classe MaClasseAuditeur. A l ’exécution, on obtient l’affichage suivant http://jb.vioix.free.fr 7-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java V Pour tester tous ces élèments, on construit une application très simple. La source est un objet de la classe MaSource, l’auditeur un objet de la classe MaClasseAuditeur. A l ’exécution, on obtient l’affichage suivant http://jb.vioix.free.fr 7-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java V Pour tester tous ces élèments, on construit une application très simple. La source est un objet de la classe MaSource, l’auditeur un objet de la classe MaClasseAuditeur. A l ’exécution, on obtient l’affichage suivant p u b l i c class T e s t E v e n e m e n t { p u b l i c s t a t i c void main ( S t r i n g [] args ) { M a S o u r c e u n e S o u r c e = new M a S o u r c e (); M a C l a s s e A u d i t e u r u n A u d i t e u r = new M a C l a s s e A u d i t e u r (); u n e S o u r c e . a j o u t e M o n E v e n e m e n t L i s t e n e r ( u n A u d i t e u r ); u n e S o u r c e . e n v o i e M o n E v e n e m e n t (); } } http://jb.vioix.free.fr 7-20 Principes des événements Implémentation en Java Principes des événements - Implémentation en Java V Pour tester tous ces élèments, on construit une application très simple. La source est un objet de la classe MaSource, l’auditeur un objet de la classe MaClasseAuditeur. A l ’exécution, on obtient l’affichage suivant L’evenement est cree ... J’ai recu un evenement de MaSource@1f6a7b9 http://jb.vioix.free.fr 7-20 Les événements dans Swing Généralités Les événements dans Swing - Généralités Les composants graphiques génèrent des évènements en fonction des actions de l’utilisateur. Les évènements sont des descendants de EventObject et respectent la syntaxe XXXEvent. Dans les composants, on trouve des méthodes AddXXXListener pour pouvoir enregistrer les auditeurs. L’auditeur doit implémenter une interface de la forme XXXListener http://jb.vioix.free.fr 8-20 Les événements dans Swing Généralités Les événements dans Swing - Généralités Les composants graphiques génèrent des évènements en fonction des actions de l’utilisateur. Les évènements sont des descendants de EventObject et respectent la syntaxe XXXEvent. Dans les composants, on trouve des méthodes AddXXXListener pour pouvoir enregistrer les auditeurs. L’auditeur doit implémenter une interface de la forme XXXListener http://jb.vioix.free.fr 8-20 Les événements dans Swing Généralités Les événements dans Swing - Généralités Les composants graphiques génèrent des évènements en fonction des actions de l’utilisateur. Les évènements sont des descendants de EventObject et respectent la syntaxe XXXEvent. Dans les composants, on trouve des méthodes AddXXXListener pour pouvoir enregistrer les auditeurs. L’auditeur doit implémenter une interface de la forme XXXListener http://jb.vioix.free.fr 8-20 Les événements dans Swing Généralités Les événements dans Swing - Généralités Les composants graphiques génèrent des évènements en fonction des actions de l’utilisateur. Les évènements sont des descendants de EventObject et respectent la syntaxe XXXEvent. Dans les composants, on trouve des méthodes AddXXXListener pour pouvoir enregistrer les auditeurs. L’auditeur doit implémenter une interface de la forme XXXListener http://jb.vioix.free.fr 8-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Les différents évènements Swing propose deux catégories d’évènements : les évènements ”simple” ou bas-niveau : ils décrivent un évènement comme un clic de souris, un déplacement de curseur, l’appui sur une touche, ... les évènements sémantiques : ils représentent des actions haut-niveau de l’utilisateur comme la sélection d’un menu, la validation d’un bouton,... Généralement, ils correspondent à un ensemble d’évènements bas-niveau. Les mêmes méthodes de gestion sont utilisées pour les deux types d’évènements. http://jb.vioix.free.fr 9-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Les différents évènements Swing propose deux catégories d’évènements : les évènements ”simple” ou bas-niveau : ils décrivent un évènement comme un clic de souris, un déplacement de curseur, l’appui sur une touche, ... les évènements sémantiques : ils représentent des actions haut-niveau de l’utilisateur comme la sélection d’un menu, la validation d’un bouton,... Généralement, ils correspondent à un ensemble d’évènements bas-niveau. Les mêmes méthodes de gestion sont utilisées pour les deux types d’évènements. http://jb.vioix.free.fr 9-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Les différents évènements Swing propose deux catégories d’évènements : les évènements ”simple” ou bas-niveau : ils décrivent un évènement comme un clic de souris, un déplacement de curseur, l’appui sur une touche, ... les évènements sémantiques : ils représentent des actions haut-niveau de l’utilisateur comme la sélection d’un menu, la validation d’un bouton,... Généralement, ils correspondent à un ensemble d’évènements bas-niveau. Les mêmes méthodes de gestion sont utilisées pour les deux types d’évènements. http://jb.vioix.free.fr 9-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Les différents évènements Swing propose deux catégories d’évènements : les évènements ”simple” ou bas-niveau : ils décrivent un évènement comme un clic de souris, un déplacement de curseur, l’appui sur une touche, ... les évènements sémantiques : ils représentent des actions haut-niveau de l’utilisateur comme la sélection d’un menu, la validation d’un bouton,... Généralement, ils correspondent à un ensemble d’évènements bas-niveau. Les mêmes méthodes de gestion sont utilisées pour les deux types d’évènements. http://jb.vioix.free.fr 9-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Un évènement bas-niveau L’évènement focusEvent est crée lorsqu’un composant prend ou perd le focus. L’interface correspondante est FocusListener qui contient deux méthodes : focusGain(FocusEvent e) qui est appelée quand le composant reçoit le focus, focusLost(FocusEvent e) qui est appelée quand le composant perd le focus. L’évènement FocusEvent comprend une méthode getOppositeComponent qui renvoie l’autre composant impliqué dans le changement de focus. http://jb.vioix.free.fr 10-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Un évènement bas-niveau L’évènement focusEvent est crée lorsqu’un composant prend ou perd le focus. L’interface correspondante est FocusListener qui contient deux méthodes : focusGain(FocusEvent e) qui est appelée quand le composant reçoit le focus, focusLost(FocusEvent e) qui est appelée quand le composant perd le focus. L’évènement FocusEvent comprend une méthode getOppositeComponent qui renvoie l’autre composant impliqué dans le changement de focus. http://jb.vioix.free.fr 10-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Un évènement bas-niveau L’évènement focusEvent est crée lorsqu’un composant prend ou perd le focus. L’interface correspondante est FocusListener qui contient deux méthodes : focusGain(FocusEvent e) qui est appelée quand le composant reçoit le focus, focusLost(FocusEvent e) qui est appelée quand le composant perd le focus. L’évènement FocusEvent comprend une méthode getOppositeComponent qui renvoie l’autre composant impliqué dans le changement de focus. http://jb.vioix.free.fr 10-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Un évènement bas-niveau L’évènement focusEvent est crée lorsqu’un composant prend ou perd le focus. L’interface correspondante est FocusListener qui contient deux méthodes : focusGain(FocusEvent e) qui est appelée quand le composant reçoit le focus, focusLost(FocusEvent e) qui est appelée quand le composant perd le focus. L’évènement FocusEvent comprend une méthode getOppositeComponent qui renvoie l’autre composant impliqué dans le changement de focus. http://jb.vioix.free.fr 10-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Un évènement bas-niveau L’évènement focusEvent est crée lorsqu’un composant prend ou perd le focus. L’interface correspondante est FocusListener qui contient deux méthodes : focusGain(FocusEvent e) qui est appelée quand le composant reçoit le focus, focusLost(FocusEvent e) qui est appelée quand le composant perd le focus. L’évènement FocusEvent comprend une méthode getOppositeComponent qui renvoie l’autre composant impliqué dans le changement de focus. http://jb.vioix.free.fr 10-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Un évènement sémantique L’évènement actionEvent correspond à l’action élémentaire d’un composant (click sur un bouton ou un élément de menu, touche [ENTREE] dans un champ de texte,...) L’interface correspondante est ActionListener qui ne contient qu’une méthode actionPerformed(ActionEvent e). C’est cette méthode qui sera appelée quand l’évènement aura lieu. http://jb.vioix.free.fr 11-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Un évènement sémantique L’évènement actionEvent correspond à l’action élémentaire d’un composant (click sur un bouton ou un élément de menu, touche [ENTREE] dans un champ de texte,...) L’interface correspondante est ActionListener qui ne contient qu’une méthode actionPerformed(ActionEvent e). C’est cette méthode qui sera appelée quand l’évènement aura lieu. http://jb.vioix.free.fr 11-20 Les événements dans Swing Les différents évènements Les événements dans Swing - Un évènement sémantique L’évènement actionEvent correspond à l’action élémentaire d’un composant (click sur un bouton ou un élément de menu, touche [ENTREE] dans un champ de texte,...) L’interface correspondante est ActionListener qui ne contient qu’une méthode actionPerformed(ActionEvent e). C’est cette méthode qui sera appelée quand l’évènement aura lieu. http://jb.vioix.free.fr 11-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique I Pour intercepter un évènement (XXXEvent) provenant d’un composant on doit fournir à celui-ci le nom d’une classe implémentant l’interface XXXListener. La classe graphique qui contient le composant peut implémenter l’interface. http://jb.vioix.free.fr 12-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique I Pour intercepter un évènement (XXXEvent) provenant d’un composant on doit fournir à celui-ci le nom d’une classe implémentant l’interface XXXListener. La classe graphique qui contient le composant peut implémenter l’interface. p u b l i c class T e s t B o u t o n e x t e n d s J P a n e l { private JLabel unLabel ; private JButton unBouton ; p r i v a t e int n =0; p u b l i c T e s t B o u t o n () { super (); u n L a b e l = new J L a b e l ( " N o m b r e de click : " + n ); u n B o u t o n = new J B u t t o n ( " Cliquez - moi ! " ); this . add ( u n L a b e l ); this . add ( u n B o u t o n ); } p u b l i c s t a t i c void main ( S t r i n g [] args ) { // ... } } http://jb.vioix.free.fr 12-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique I Pour intercepter un évènement (XXXEvent) provenant d’un composant on doit fournir à celui-ci le nom d’une classe implémentant l’interface XXXListener. La classe graphique qui contient le composant peut implémenter l’interface. http://jb.vioix.free.fr 12-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique I Pour intercepter un évènement (XXXEvent) provenant d’un composant on doit fournir à celui-ci le nom d’une classe implémentant l’interface XXXListener. La classe graphique qui contient le composant peut implémenter l’interface. p u b l i c class T e s t B o u t o n e x t e n d s J P a n e l i m p l e m e n t s A c t i o n L i s t e n e r { private JLabel unLabel ; private JButton unBouton ; p r i v a t e int n =0; p u b l i c T e s t B o u t o n () { // ... u n B o u t o n . a d d A c t i o n L i s t e n e r ( this ); } p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) { n ++; u n L a b e l . s e t T e x t ( " N o m b r e de click : " + n ); } // ... } http://jb.vioix.free.fr 12-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique I Pour intercepter un évènement (XXXEvent) provenant d’un composant on doit fournir à celui-ci le nom d’une classe implémentant l’interface XXXListener. La classe graphique qui contient le composant peut implémenter l’interface. http://jb.vioix.free.fr 12-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique I Pour intercepter un évènement (XXXEvent) provenant d’un composant on doit fournir à celui-ci le nom d’une classe implémentant l’interface XXXListener. La classe graphique qui contient le composant peut implémenter l’interface. http://jb.vioix.free.fr 12-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique II Il est possible de gérer plusieurs types d’évènements ainsi, il suffit d’implémenter les différentes interfaces. Dans le cas où différents composants provoque le même évènement, la source doit être identifiée avec la méthode getSource : http://jb.vioix.free.fr 13-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique II Il est possible de gérer plusieurs types d’évènements ainsi, il suffit d’implémenter les différentes interfaces. Dans le cas où différents composants provoque le même évènement, la source doit être identifiée avec la méthode getSource : p u b l i c class Tests e x t e n d s J P a n e l i m p l e m e n t s A c t i o n L i s t e n e r , K e y L i s t e n e r { // ... JButton leBouton ; JTextField leTextField ; // ... p u b l i c T e s t A c t i o n L i s t e n e r () { // ... l e B o u t o n . a d d A c t i o n L i s t e n e r ( this ); l e T e x t F i e l d . a d d K e y L i s t e n e r ( this ); // ... } p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) { /* ... */ } p u b l i c void k e y T y p e d ( K e y E v e n t e ) { /* ... */ } p u b l i c void k e y P r e s s e d ( K e y E v e n t e ) { /* ... */ } p u b l i c void k e y R e l e a s e d ( K e y E v e n t e ) { /* ... */ } // ... http://jb.vioix.free.fr 13-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique II Il est possible de gérer plusieurs types d’évènements ainsi, il suffit d’implémenter les différentes interfaces. Dans le cas où différents composants provoque le même évènement, la source doit être identifiée avec la méthode getSource : http://jb.vioix.free.fr 13-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique II Il est possible de gérer plusieurs types d’évènements ainsi, il suffit d’implémenter les différentes interfaces. Dans le cas où différents composants provoque le même évènement, la source doit être identifiée avec la méthode getSource : p u b l i c class T e s t D e u x B o u t o n e x t e n d s J P a n e l i m p l e m e n t s A c t i o n L i s t e n e r { // ... J B u t t o n leBouton1 , l e B o u t o n 2 ; // ... p u b l i c T e s t D e u x B o u t o n () { // ... l e B o u t o n 1 . a d d A c t i o n L i s t e n e r ( this ); l e B o u t o n 2 . a d d A c t i o n L i s t e n e r ( this ); // ... } p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) { if ( e . g e t S o u r c e ()== l e B o u t t o n 1 ){ /* La s o u r c e est l e B o u t o n 1 */ } if ( e . g e t S o u r c e ()== l e B o u t t o n 2 ){ /* La s o u r c e est l e B o u t o n 2 */ } } // ... http://jb.vioix.free.fr 13-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique III Cette approche très simple n’est utilisée que pour des petits programmes. Aucune séparation n’est faite entre l’interface graphique et la partie fonctionnelle du programme. Les modifications du programme sont assez lourdes si on ajoute/retire un composant ou une fonction. Les approches de type MVC sont préférées pour des programmes plus conséquents. http://jb.vioix.free.fr 14-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique III Cette approche très simple n’est utilisée que pour des petits programmes. Aucune séparation n’est faite entre l’interface graphique et la partie fonctionnelle du programme. Les modifications du programme sont assez lourdes si on ajoute/retire un composant ou une fonction. Les approches de type MVC sont préférées pour des programmes plus conséquents. http://jb.vioix.free.fr 14-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique III Cette approche très simple n’est utilisée que pour des petits programmes. Aucune séparation n’est faite entre l’interface graphique et la partie fonctionnelle du programme. Les modifications du programme sont assez lourdes si on ajoute/retire un composant ou une fonction. Les approches de type MVC sont préférées pour des programmes plus conséquents. http://jb.vioix.free.fr 14-20 Les événements dans Swing Gestion des évènements dans la classe graphique Les événements dans Swing - Gestion des évènements dans la classe graphique III Cette approche très simple n’est utilisée que pour des petits programmes. Aucune séparation n’est faite entre l’interface graphique et la partie fonctionnelle du programme. Les modifications du programme sont assez lourdes si on ajoute/retire un composant ou une fonction. Les approches de type MVC sont préférées pour des programmes plus conséquents. http://jb.vioix.free.fr 14-20 Les événements dans Swing Gestion des évènements hors de la classe graphique Les événements dans Swing - Gestion des évènements hors de la classe graphique I Pour des applications conséquentes, on préfère externaliser la gestion des évènements dans des classes auditeurs. On construit autant de classes auditeurs que d’évènements et de sources d’évènements. On instancie ensuite un objet pour chaque auditeur. http://jb.vioix.free.fr 15-20 Les événements dans Swing Gestion des évènements hors de la classe graphique Les événements dans Swing - Gestion des évènements hors de la classe graphique I Pour des applications conséquentes, on préfère externaliser la gestion des évènements dans des classes auditeurs. On construit autant de classes auditeurs que d’évènements et de sources d’évènements. On instancie ensuite un objet pour chaque auditeur. http://jb.vioix.free.fr 15-20 Les événements dans Swing Gestion des évènements hors de la classe graphique Les événements dans Swing - Gestion des évènements hors de la classe graphique I Pour des applications conséquentes, on préfère externaliser la gestion des évènements dans des classes auditeurs. On construit autant de classes auditeurs que d’évènements et de sources d’évènements. On instancie ensuite un objet pour chaque auditeur. p u b l i c class L i s t e n e r B o u t o n 1 i m p l e m e n t s A c t i o n L i s t e n e r { // ... p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) { // ... P a r t i e u t i l e } // ... } http://jb.vioix.free.fr 15-20 Les événements dans Swing Gestion des évènements hors de la classe graphique Les événements dans Swing - Gestion des évènements hors de la classe graphique I Pour des applications conséquentes, on préfère externaliser la gestion des évènements dans des classes auditeurs. On construit autant de classes auditeurs que d’évènements et de sources d’évènements. On instancie ensuite un objet pour chaque auditeur. p u b l i c class L i s t e n e r B o u t o n 2 i m p l e m e n t s A c t i o n L i s t e n e r { // ... p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) { // ... P a r t i e u t i l e } // ... } http://jb.vioix.free.fr 15-20 Les événements dans Swing Gestion des évènements hors de la classe graphique Les événements dans Swing - Gestion des évènements hors de la classe graphique I Pour des applications conséquentes, on préfère externaliser la gestion des évènements dans des classes auditeurs. On construit autant de classes auditeurs que d’évènements et de sources d’évènements. On instancie ensuite un objet pour chaque auditeur. http://jb.vioix.free.fr 15-20 Les événements dans Swing Gestion des évènements hors de la classe graphique Les événements dans Swing - Gestion des évènements hors de la classe graphique I Pour des applications conséquentes, on préfère externaliser la gestion des évènements dans des classes auditeurs. On construit autant de classes auditeurs que d’évènements et de sources d’évènements. On instancie ensuite un objet pour chaque auditeur. p u b l i c class T e s t C l a s s e s E x t e r n e s e x t e n d s J P a n e l { // ... J B u t t o n leBouton1 , l e B o u t o n 2 ; // ... p u b l i c T e s t C l a s s e s E x t e r n e s () { // ... l e B o u t o n 1 = new J B u t t o n ( " B o u t o n 1 " ); l e B o u t o n 2 = new J B u t t o n ( " B o u t o n 2 " ); // ... l e B o u t o n 1 . a d d A c t i o n L i s t e n e r ( new L i s t e n e r B o u t o n 1 ()); l e B o u t o n 2 . a d d A c t i o n L i s t e n e r ( new L i s t e n e r B o u t o n 2 ()); // ... } http://jb.vioix.free.fr 15-20 Les événements dans Swing Gestion des évènements hors de la classe graphique Les événements dans Swing - Gestion des évènements hors de la classe graphique II Cette méthode permet de bien séparer l’interface du reste de l’application. Les éléments du programme sont très structurés (un fichier par classe donc par évènement et par source). Tels quels, les auditeurs n’ont pas accès aux variables membres de la classe graphique, à moins de surcharger les constructeurs. http://jb.vioix.free.fr 16-20 Les événements dans Swing Gestion des évènements hors de la classe graphique Les événements dans Swing - Gestion des évènements hors de la classe graphique II Cette méthode permet de bien séparer l’interface du reste de l’application. Les éléments du programme sont très structurés (un fichier par classe donc par évènement et par source). Tels quels, les auditeurs n’ont pas accès aux variables membres de la classe graphique, à moins de surcharger les constructeurs. http://jb.vioix.free.fr 16-20 Les événements dans Swing Gestion des évènements hors de la classe graphique Les événements dans Swing - Gestion des évènements hors de la classe graphique II Cette méthode permet de bien séparer l’interface du reste de l’application. Les éléments du programme sont très structurés (un fichier par classe donc par évènement et par source). Tels quels, les auditeurs n’ont pas accès aux variables membres de la classe graphique, à moins de surcharger les constructeurs. http://jb.vioix.free.fr 16-20 Les événements dans Swing Utilisation des classes membres internes Les événements dans Swing - Utilisation des classes membres internes Pour éviter la multiplication des fichiers et permettre l’accès aux variables membres de la classe mère, on peut utiliser des classes membres internes. Les classes externes sont simplement implémentées dans la classe graphique. http://jb.vioix.free.fr 17-20 Les événements dans Swing Utilisation des classes membres internes Les événements dans Swing - Utilisation des classes membres internes Pour éviter la multiplication des fichiers et permettre l’accès aux variables membres de la classe mère, on peut utiliser des classes membres internes. Les classes externes sont simplement implémentées dans la classe graphique. http://jb.vioix.free.fr 17-20 Les événements dans Swing Utilisation des classes membres internes Les événements dans Swing - Utilisation des classes membres internes Pour éviter la multiplication des fichiers et permettre l’accès aux variables membres de la classe mère, on peut utiliser des classes membres internes. Les classes externes sont simplement implémentées dans la classe graphique. p u b l i c class C l a s s e s M e m b r e s I n t e r n e s e x t e n d s J P a n e l { // ... J B u t t o n leBouton1 , l e B o u t o n 2 ; // ... p u b l i c C l a s s e s M e m b r e s I n t e r n e s () { // ... l e B o u t o n 1 . a d d A c t i o n L i s t e n e r ( new L i s t e n e r B o u t o n 1 ()); l e B o u t o n 2 . a d d A c t i o n L i s t e n e r ( new L i s t e n e r B o u t o n 2 ()); // ... } p r i v a t e class L i s t e n e r B o u t o n 1 i m p l e m e n t s A c t i o n L i s t e n e r { p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) { /* P a r t i e u t i l e */ } } p r i v a t e class L i s t e n e r B o u t o n 2 i m p l e m e n t s A c t i o n L i s t e n e r { p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) { /* P a r t i e u t i l e */ } } } http://jb.vioix.free.fr 17-20 Les événements dans Swing Utilisation des classes internes anonymes Les événements dans Swing - Utilisation des classes internes anonymes Les classes internes auditeurs ne sont instanciées qu’une seule fois, pour éviter les deux étapes distinctes déclaration puis instanciation on peut utiliser les classes internes anonymes. http://jb.vioix.free.fr 18-20 Les événements dans Swing Utilisation des classes internes anonymes Les événements dans Swing - Utilisation des classes internes anonymes Les classes internes auditeurs ne sont instanciées qu’une seule fois, pour éviter les deux étapes distinctes déclaration puis instanciation on peut utiliser les classes internes anonymes. p u b l i c class C l a s s e s I n t e r n e s A n o n y m e s e x t e n d s J P a n e l { // ... JButton leBouton ; JTextField leTextField ; // ... p u b l i c C l a s s e s I n t e r n e s A n o n y m e s () { // ... l e B o u t o n = new J B u t t o n ( " B o u t o n 1 " ); l e T e x t F i e l d = new J T e x t F i e l d (); // ... l e B o u t o n . a d d A c t i o n L i s t e n e r ( new A c t i o n L i s t e n e r () { p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) { /* P a r t i e u t i l e */ } }); l e T e x t F i e l d . a d d F o c u s L i s t e n e r ( new F o c u s L i s t e n e r (){ p u b l i c void f o c u s G a i n e d ( F o c u s E v e n t e ) { /* P a r t i e u t i l e */ } p u b l i c void f o c u s L o s t ( F o c u s E v e n t e ) { /* P a r t i e u t i l e */ } }); } http://jb.vioix.free.fr 18-20 Les événements dans Swing Les classes d’adaptation Les événements dans Swing - Les classes d’adaptation ou adaptateurs factices - I Les différentes approches précédentes ont toutes un point commun. Les auditeurs étant basés sur une interface, toutes les méthodes de l’interface doivent être déclarée même si elles ne sont pas implémentées. Par exemple, l’interface MouseListener propose 5 méthodes (mouseClicked, mouseEntered, mouseExited, mousePressed et mouseReleased). Pour éviter de déclarer toutes les méthodes de MouseListener, Swing propose l’utilisation de classe d’adaptation. Ce sont des classes notées XXXAdapter qui implémentent les auditeurs. http://jb.vioix.free.fr 19-20 Les événements dans Swing Les classes d’adaptation Les événements dans Swing - Les classes d’adaptation ou adaptateurs factices - I Les différentes approches précédentes ont toutes un point commun. Les auditeurs étant basés sur une interface, toutes les méthodes de l’interface doivent être déclarée même si elles ne sont pas implémentées. Par exemple, l’interface MouseListener propose 5 méthodes (mouseClicked, mouseEntered, mouseExited, mousePressed et mouseReleased). Pour éviter de déclarer toutes les méthodes de MouseListener, Swing propose l’utilisation de classe d’adaptation. Ce sont des classes notées XXXAdapter qui implémentent les auditeurs. http://jb.vioix.free.fr 19-20 Les événements dans Swing Les classes d’adaptation Les événements dans Swing - Les classes d’adaptation ou adaptateurs factices - I Les différentes approches précédentes ont toutes un point commun. Les auditeurs étant basés sur une interface, toutes les méthodes de l’interface doivent être déclarée même si elles ne sont pas implémentées. Par exemple, l’interface MouseListener propose 5 méthodes (mouseClicked, mouseEntered, mouseExited, mousePressed et mouseReleased). Pour éviter de déclarer toutes les méthodes de MouseListener, Swing propose l’utilisation de classe d’adaptation. Ce sont des classes notées XXXAdapter qui implémentent les auditeurs. http://jb.vioix.free.fr 19-20 Les événements dans Swing Les classes d’adaptation Les événements dans Swing - Les classes d’adaptation ou adaptateurs factices - I Les différentes approches précédentes ont toutes un point commun. Les auditeurs étant basés sur une interface, toutes les méthodes de l’interface doivent être déclarée même si elles ne sont pas implémentées. Par exemple, l’interface MouseListener propose 5 méthodes (mouseClicked, mouseEntered, mouseExited, mousePressed et mouseReleased). Pour éviter de déclarer toutes les méthodes de MouseListener, Swing propose l’utilisation de classe d’adaptation. Ce sont des classes notées XXXAdapter qui implémentent les auditeurs. http://jb.vioix.free.fr 19-20 Les événements dans Swing Les classes d’adaptation Les événements dans Swing - Les classes d’adaptation ou adaptateurs factices - II Par exemple, la classe MouseAdapter propose les méthodes suivantes : Pour utiliser une classe d’adaptation, il suffit d’en hériter pour construire l’auditeur et de surcharger les méthodes utiles. Cette facilité de programmation peut être utilisée dans les méthodes présentées précédemment. Toutefois, Java ne proposant pas l’héritage multiple, il faut écrire un auditeur par type d’évènement (il reste toujours possible d’identifier la source). http://jb.vioix.free.fr 20-20 Les événements dans Swing Les classes d’adaptation Les événements dans Swing - Les classes d’adaptation ou adaptateurs factices - II Par exemple, la classe MouseAdapter propose les méthodes suivantes : Pour utiliser une classe d’adaptation, il suffit d’en hériter pour construire l’auditeur et de surcharger les méthodes utiles. Cette facilité de programmation peut être utilisée dans les méthodes présentées précédemment. Toutefois, Java ne proposant pas l’héritage multiple, il faut écrire un auditeur par type d’évènement (il reste toujours possible d’identifier la source). p u b l i c class M o u s e A d a p t e r { // ... p u b l i c void m o u s e C l i c k e d ( M o u s e E v e n t e ) {} p u b l i c void m o u s e E n t e r e d ( M o u s e E v e n t e ) {} p u b l i c void m o u s e E x i t e d ( M o u s e E v e n t e ) {} p u b l i c void m o u s e P r e s s e d ( M o u s e E v e n t e ) {} p u b l i c void m o u s e R e l e a s e d ( M o u s e E v e n t e ) {} // ... } http://jb.vioix.free.fr 20-20 Les événements dans Swing Les classes d’adaptation Les événements dans Swing - Les classes d’adaptation ou adaptateurs factices - II Par exemple, la classe MouseAdapter propose les méthodes suivantes : Pour utiliser une classe d’adaptation, il suffit d’en hériter pour construire l’auditeur et de surcharger les méthodes utiles. Cette facilité de programmation peut être utilisée dans les méthodes présentées précédemment. Toutefois, Java ne proposant pas l’héritage multiple, il faut écrire un auditeur par type d’évènement (il reste toujours possible d’identifier la source). http://jb.vioix.free.fr 20-20 Les événements dans Swing Les classes d’adaptation Les événements dans Swing - Les classes d’adaptation ou adaptateurs factices - II Par exemple, la classe MouseAdapter propose les méthodes suivantes : Pour utiliser une classe d’adaptation, il suffit d’en hériter pour construire l’auditeur et de surcharger les méthodes utiles. Cette facilité de programmation peut être utilisée dans les méthodes présentées précédemment. Toutefois, Java ne proposant pas l’héritage multiple, il faut écrire un auditeur par type d’évènement (il reste toujours possible d’identifier la source). p u b l i c class M o n A u d i t e u r e x t e n d s M o u s e A d a p t e r { // ... p u b l i c void m o u s e C l i c k e d ( M o u s e E v e n t e ) { // L ’ a u d i t e u r ne t r a i t e que les c l i c s de s o u r i s } } http://jb.vioix.free.fr 20-20 Les événements dans Swing Les classes d’adaptation Les événements dans Swing - Les classes d’adaptation ou adaptateurs factices - II Par exemple, la classe MouseAdapter propose les méthodes suivantes : Pour utiliser une classe d’adaptation, il suffit d’en hériter pour construire l’auditeur et de surcharger les méthodes utiles. Cette facilité de programmation peut être utilisée dans les méthodes présentées précédemment. Toutefois, Java ne proposant pas l’héritage multiple, il faut écrire un auditeur par type d’évènement (il reste toujours possible d’identifier la source). http://jb.vioix.free.fr 20-20 Les événements dans Swing Les classes d’adaptation Les événements dans Swing - Les classes d’adaptation ou adaptateurs factices - II Par exemple, la classe MouseAdapter propose les méthodes suivantes : Pour utiliser une classe d’adaptation, il suffit d’en hériter pour construire l’auditeur et de surcharger les méthodes utiles. Cette facilité de programmation peut être utilisée dans les méthodes présentées précédemment. Toutefois, Java ne proposant pas l’héritage multiple, il faut écrire un auditeur par type d’évènement (il reste toujours possible d’identifier la source). http://jb.vioix.free.fr 20-20