Cours 2 : programmation des interfaces graphiques



Documents pareils
Cours. Cours 8 : Révisions. Importance. Interface homme-machine

Interfaces graphiques avec l API Swing

Java 7 Les fondamentaux du langage Java

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Développement Logiciel

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Construire des plug-ins pour SAS Management Console SAS 9.1

Architecture générale des interfaces graphiques. IHM: Fondements des Interfaces Graphiques. Applications. Outils de construction d interfaces

Desktop Intégration. Rémi Forax

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

ACTIVITÉ DE PROGRAMMATION

Auto-évaluation Programmation en Java

Once the installation is complete, you can delete the temporary Zip files..

Solutions du chapitre 4

L informatique en BCPST

Introduction au langage Java

Paramètres d accessibilité des systèmes d exploitation Windows et Mac

Le langage JAVA G. Baulieu Institut de Physique Nucléaire de Lyon Septembre 2009

TP1 : Initiation à Java et Eclipse

Atelier «personnaliser l environnement de l ordinateur mai 2015

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Environnements de développement (intégrés)

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

PRISE EN MAIN D UN TABLEUR. Version OPEN OFFICE

Anne Tasso. Java. Le livre de. premier langage. 6 e édition. Groupe Eyrolles, 2000, 2002, 2005, 2006, 2008, 2010, ISBN :

Support pour les langues s écrivant de droite à gauche

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Initiation à LabView : Les exemples d applications :

Unity. Moteur de jeu 3D et 2D. Cross platform: Windows, Mac, Linux, ios, Android, Blackberry, Xbox, Playstation, Wii

Avant-propos FICHES PRATIQUES EXERCICES DE PRISE EN MAIN CAS PRATIQUES

Introduction à Eclipse

Table des matières Introduction Démarrage Les composants graphiques... 26

Spécifications techniques

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Tapez le titre de la page «BASTIA ville méditerranéenne», puis allez deux fois à la ligne à l aide de la touche Entrée.

Programmation Orientée Objet

La programmation orientée objet et le langage C++

Manuel de System Monitor

Asset Management Software Client Module. Manuel d utilisation

Création d un formulaire de contact Procédure

TD3 - Facturation avec archivage automatisé

Programmation C. Apprendre à développer des programmes simples dans le langage C

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Formation. Module WEB 4.1. Support de cours

Support de TD ArcGIS Introduction à l automatisation et au développement avec ArcGIS 10.1 JEAN-MARC GILLIOT e année ingénieur

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

Temps Réel. Jérôme Pouiller Septembre 2011

Alfstore workflow framework Spécification technique

Programmer en JAVA. par Tama

GUIDE UTILISATEUR SYSTEMES CCTV

Conférence Web sur demande de TELUS Guide de référence rapide

WEB page builder and server for SCADA applications usable from a WEB navigator

TP2 : Client d une BDD SqlServer

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Les calques : techniques avancées

Évaluation et implémentation des langages

Optimiser pour les appareils mobiles

L espace de travail de Photoshop

Guide d installation CLX.PayMaker Office (3PC)

Assistance à distance sous Windows

INTRODUCTION AUX TESTS CODES DE L INTERFACE UTILISATEUR

Création d'une interface graphique

Mise en scène d un modèle dans l espace 3D

Le langage C. Séance n 4

Cyber-base du Pays Martégal. Atelier «Découverte de l ordinateur»

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Mon aide mémoire traitement de texte (Microsoft Word)

Plan du cours. Historique du langage Nouveautés de Java 7

Publier un Carnet Blanc

Guide d'utilisation. OpenOffice Calc. AUTEUR INITIAL : VINCENT MEUNIER Publié sous licence Creative Commons

Préparation à l examen EFA en Macro

Micro-ordinateurs, informations, idées, trucs et astuces utiliser le Bureau à distance

Silhouette Studio Leçon N 2

HP Data Protector Express Software - Tutoriel 3. Réalisation de votre première sauvegarde et restauration de disque

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

L ARBORESCENCE. Qu est-ce qu un dossier? L arborescence?

Package Java.util Classe générique

WINDOWS 8. Windows 8 se distingue par la présence de 2 interfaces complémentaires :

MIGRATION DE THUNDERBIRD VERS OUTLOOK mardi 16 octobre 2012

L ORDINATEUR FACILE D ACCÈS!

SOMMAIRE. Présentation assistée sur ordinateur. Collège F.Rabelais 1/10

Comment consolider des données

TD/TP 1 Introduction au SDK d Android

AVEC LIVE TRADER, VISEZ PLUS HAUT POUR VOS INVESTISSEMENTS

Objets et Programmation. origine des langages orientés-objet

3 : créer de nouveaux onglets dans Netvibes Cliquer sur le bouton «+» et renommer le nouvel onglet (par exemple Encyclopédies en ligne)

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Derrière toi Une machine virtuelle!

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

IFT785 Approches Orientées Objets. FINAL Été Remise : Jeudi 19 août 2002 à 9h00 am

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Board (Tablette) Manuel de l utilisateur. Windows 7 / XP / Vista

Transcription:

Cours 2 : programmation des interfaces graphiques Anastasia.Bezerianos@lri.fr (partie de la présentation basée sur des transparents de Michel Beaudouin-Lafon) système interactif vs. système algorithmique système algorithmique (fermé) : lit des entrées, calcule, produit un résultat il y a un état final système interactif (ouvert) : évènements provenant de l extérieur boucle infinie, non déterministe A. Bezerianos 1

interfaces graphiques l'interaction graphique : les entrées sont spécifiées directement à partir des sorties périphérique d entrée spécifie dans une commande une position à l'écran qui désigne un objet précédemment affiché par le système (cette désignation directe est appelée pointage). Elle est familière dans le monde physique, donc le succès de ces interfaces problème nous avons appris à programmer des algorithmes (la partie calcul ) la plupart des langages de programmation (C, C++, Java, Lisp, Scheme, Ada, Pascal, Fortran, Cobol,...) sont conçus pour écrire des algorithmes, pas des systèmes interactifs A. Bezerianos 2

problème entée/sortie des langues algorithmiques instructions de sortie (print, put, send, ) pour envoyer des données aux périphériques instructions de lecture (read, get, receive, ) pour lire l état ou changement d états de périphériques d entrée, du façon bloquante comment gérer les entrées - - 1 pér. à la fois - Attente active - état des plusieurs pér. - CPU A. Bezerianos 3

programmation événementielle File d attente (queue) while active! if queue is not empty! event <- queue.dequeue()! source <- findsource(event)! source.processevent(event)! end if! end while! queue.enqueue(event) Animations : horloge comme source d évènements «tick» -> évènement -> progrès programmation événementielle Source : Mouse Click File d attente (queue) while active! if queue is not empty! event <- queue.dequeue()! source <- findsource(event)! source.processevent(event)! end if! end while! queue.enqueue(event) Cible : Bouton «Cancel» processevent(event)! target <- FindTarget (event)! if (target NULL)!! target.processevent(event)! Animations : horloge comme source d évènements «tick» -> évènement -> progrès A. Bezerianos 4

ex. Swing (et AWT) 3 threads dans JVM: main () toolkit thread : reçoit (de l OS) les événements et les met dans une file d'attente AWT Event Queue EDT gère la file d'attente: envoie des événements aux auditeurs Event Dispacher Thread listeners (objets qui traitent (EDT) d'événements) et appelle les méthodes de peinture (drawing functions) Listeners paint () couches logicielles Squelette d application MacApp Java Swing, Qt, GTK+, MFC, Cocoa X Windows GDI+, Quartz, GTK+/Xlib, OpenGL Windows, Mac OS X, Linux A. Bezerianos 5

constructeurs d interface Exemples : MS Visual Studio (C++, C#, etc.), NetBeans (Java), Interface Builder (ObjectiveC) boîte à outils d interface bibliothèque d objets interactifs (les «widgets») que l on assemble pour construire l interface fonctionnalités pour faciliter la programmation d applications graphiques interactives (et gérer les entrées) Windows : MFC, Windows Forms (.NET) Mac OS X : Cocoa Unix/Linux : Motif Multiplateforme : Java AWT/Swing, QT, GTK+ A. Bezerianos 6

boîte à outils d interface Toolkit Platform Language Qt multiplatform C++ GTK+ multiplatform C MFC later WTL Windows C++ WPF (subset of WTL) Windows (any.net language) FLTK multiplatform C++ AWT / Swing multiplatform Java Cocoa MacOs Objective C Gnustep Linux, Windows Objective C Motif Linux C JQuery UI Web javascript Problèmes avec les toolkits?. les «widgets» (window gadget) bouton menu fenêtre barre d outils onglet étiquette zone de texte bouton radio liste barre de défilement «slider» A. Bezerianos 7

les widgets de Swing les widgets de Swing A. Bezerianos 8

arbre des widgets widgets «simples» buttons, barres de défilement, widgets «composés» Distinés à contenir d autres widgets (simples ou composés) Boites de dialogue, menus, arbre des widgets représentation hiérarchique de la structure des widgets un composant ne peut appartenir qu à un seul «container» Racine (composé) correspond à une fenêtre de l appli Nœuds (composé) Structure visuel ou fonctionnel du contenu Feuille (simple) avec lesquels l utilisateur peut interagir A. Bezerianos 9

Swing widget classes Une application graphique a un widget de haut niveau (conteneur) qui comprend tous les autres Swing a 3 types: JFrame, JDialog et JApplet Ils contiennent tous les autres widgets (simples ou complexes), qui sont déclarées dans le champ ContentPane Swing widget classes Partial object hierarchy of Swing widgets Abstract class Characteristics of almost all components http://docs.oracle.com/javase/tutorial/ui/features/components.html AWT (plus vieux) est plus connecté au système graphique. Swing est son extension (moins d utilisation du système graphique). A. Bezerianos 10

Swing JFrame une fenêtre public static void main(string[] args) {! JFrame jf = new JFrame( Ta ta!");! jf.setvisible(true);! jf.setdefaultcloseoperation(jframe.exit_on_close);! System.out.println( finished?!?");! System.out.println( no, still running ");! }! Quelques fonctions public JFrame(); public JFrame(String name); public Container getcontentpane(); public void setjmenubar(jmenubar menu); public void settitle(string title); public void seticonimage(image image); Le programme ne termine pas après no, still running! Swing JDialog une fenêtre de dialogue peut être "modal" (c.à.d bloquer l interaction) attachés à une autre fenêtre (la boîte de dialogue ferme avec ceci) public static void main(string[] args) {! JFrame jf = new JFrame( ta ta!");! jf.setvisible(true);! jf.setdefaultcloseoperation(jframe.exit_on_close);!! JDialog jd = new JDialog(jf, A dialog",true);!!! jd.setvisible(true);! }! modal attached to A. Bezerianos 11

import javax.swing.*; public class SwingDemo1 { public static void main(string[] args) { JFrame frame = new JFrame(); frame.settitle("example 1"); frame.getcontentpane().add(new JLabel("Swing Demo 1")); frame.setdefaultcloseoperation(javax.swing.jframe.exit_on_close); frame.getcontentpane().add(new JButton("clique ici")); } } frame.setsize(100,50); frame.setvisible(true); where is the label? Bruce Eckel, Thinking in Java, 2 nd edition placement de widgets Boîtes à outilles contrôlent le placement des widgets : il faut être indépendant de la taille des widgets (menu au moins égale à son plus large item, en changement de taille la barre de défilement et le texte s ajustent) gestionnaires de géométrie, dans le widgets composés A. Bezerianos 12

placement de widgets règles générales imbrication géométrique d un widget fils dans son parent contrôle par le parent du placement de ses fils algorithme de placement taille naturelle de chaque fils taille et position finales imposées par le parent contraintes : grille, formulaire, etc. «layout managers» (Swing) BorderLayout FlowLayout BoxLayout GridLayout GroupLayout http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html A. Bezerianos 13

«layout managers» (Swing) GridLayout gridlayout = new GridLayout(0,2);! JPanel gridpanel = new JPanel();! gridpanel.setlayout(gridlayout);! gridpanel.add(new JButton("Button 1"));! gridpanel.add(new JButton("Button 2"));! gridpanel.add(new JButton("Button 3"));! gridpanel.add(new JButton("Long-Named Button 4"));! gridpanel.add(new JButton("5"));! import javax.swing.*; import java.awt.*; public class SwingDemo4 extends JFrame { public void init() { Container cp = getcontentpane(); this.settitle("example 4"); this.setdefaultcloseoperation(exit_on_close); } cp.setlayout(new FlowLayout()); for(int i = 0; i < 20; i++) cp.add(new JButton("Button " + i)); public static void main(string[] args) { SwingDemo4 frame = new SwingDemo4(); frame.init(); } } frame.setsize(200,700); frame.setvisible(true); Bruce Eckel, Thinking in Java, 2 nd edition A. Bezerianos 14

import javax.swing.*; import java.awt.*; public class SwingDemo5 extends JFrame { public void init() { Container cp = getcontentpane(); this.settitle("example 5"); this.setdefaultcloseoperation(exit_on_close); } cp.setlayout(new GridLayout(7,3)); for(int i = 0; i < 20; i++) cp.add(new JButton("Button " + i)); public static void main(string[] args) { SwingDemo5 frame = new SwingDemo5(); frame.init(); } } frame.setsize(200,700); frame.setvisible(true); Inspiré de: Bruce Eckel, Thinking in Java, 2e édition guides de placement (Mac OS X) A. Bezerianos 15

guides de placement (Mac OS X) «Center-equalization» : équilibre visuelle du contenu d un composant, à droite et à gauche de la médiane guides de placement (Mac OS X) Alignement Colonne d étiquettes alignée à droite Colonne de contrôles alignée à gauche A. Bezerianos 16

guides de placement (Mac OS X) Espacement Même hauteur avant et après les lignes de séparation Même espace entre des contrôles groupés Même espace dans tous les trois côtés guides de placement (Mac OS X) Alignement et cohérence Colonne d étiquettes alignée à droite Colonne de contrôles alignée à gauche Cohérence entre les contrôles du même type A. Bezerianos 17

CRAP contraste, répétition, alignement, proximité Major sources: Designing Visual Interfaces, Mullet & Sano, Prentice Hall / Robin Williams Non-Designers Design Book, Peachpit Press Slide deck by Saul Greenberg. Permission is granted to use this for non-commercial purposes as long as general credit to Saul Greenberg is clearly maintained. Warning: some material in this deck is used from other sources without permission. Credit to the original source is given if it is known. A. Bezerianos 18

A. Bezerianos 19

CRAP Contraste Répétition Alignement Proximité Robin Williams Non-Designers Design Book, Peachpit Press CRAP Contraste Faire des choses différentes différents Maitre en évidence les élém. dominantes Faire élém. moins importants moins visible Créer un dynamisme 1 Répétition Alignement Proximité 2 3 4 5 Robin Williams Non-Designers Design Book, Peachpit Press A. Bezerianos 20

CRAP Contraste Répétition Conception repetée au long de l interface Consistance 1 Créer unité Alignement Proximité 2 3 Robin Williams Non-Designers Design Book, Peachpit Press 4 CRAP Contraste Répétition Alignement Créer un flux visuel Connecter élém. Proximité 3 1 Robin Williams Non-Designers Design Book, Peachpit Press 4 2 A. Bezerianos 21

CRAP Contraste Répétition Alignement Proximité Groupes évidentes Indépendants séparées 3 1 2 Robin Williams Non-Designers Design Book, Peachpit Press Qu est-ce que tu vois d abord? CRAP donne des indices sur la façon de lire le graphique title subtext three points main point sub point Robin Williams Non-Designers Design Book, Peachpit Press A. Bezerianos 22

Qu est-ce que tu vois d abord? La puissance de la proximité Alignement Structure explicite peut être améliorée Espace blanc Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: Mmmm: A. Bezerianos 23

Original A. Bezerianos 24

Proximité Alignement A. Bezerianos 25

Contraste Répétition A. Bezerianos 26

facettes d un widget présentation apparence graphique comportement réactions aux actions de l utilisateur interfaces d application : notifications de changement d état Bouton: cadre avec un nom à l intérieur «enfoncement» ou inversion vidéo lorsque l on clique dessus grisé quand non-disponible + fonction appelée lorsque le bouton est cliqué facettes d un widget présentation apparence graphique comportement réactions aux actions de l utilisateur interfaces d application : notifications de changement d état variables actives (Tcl/Tk) envoi de message (Qt) fonctions de rappel («callbacks») (Swing) A. Bezerianos 27

variables actives (wrapped vars) lien bi-directionnel entre une variable d état du widget et une variable de l application main (){! }! problèmes limité aux types simples int i = 0;!! /* widget */! nc = CreateSlider ( );! /* var active */! SetIntegerActiveVariable (nc, &i);!! lien de retour peut être coûteux erreurs lorsque les liens sont mis à jour à la main envoi de message (event dispatching) widgets agissent comme des périphériques d'entrée et envoient des événements lorsque leurs changements d'état association d un objet à un widget et de méthodes de l objet aux changements d état une boucle «while» lit et traite des événements A. Bezerianos 28

envoi de message (event dispatching) division d'envoi et de traitement des événements meilleure encapsulation (à l'intérieur de la classe de widget) mais quand des comportements similaires existent... fonctions de rappel Enregistrement lors de la création du widget Appel lors l activation du widget A. Bezerianos 29

fonctions de rappel Problème : spaghetti des callbacks Partage d état entre plusieurs callbacks par: variables globales Trop dans une application réelle arbre des widgets : la fonction de rappel est appelée en lui passant le widget qui l a déclenché Fragile si l on change la structure, insuffisante pour d autres données pas associés aux widgets «jeton» (token) : donnée enregistrée avec la callback, passée automatiquement au moment de l appel fonctions de rappel /* fonction de rappel */! void DoSave (Widget w, void* data) {!! /* récupérer le nom de fichier */!! filename = (char**) data;!! /* appeler la fonction de l application */!! SaveTo (filename);!! /* fermer la boîte de dialogue */!! CloseWindow (getparent(getparent(w)));! }! /* programme principal */! main () {!! /* variable contenant le nom du fichier */!! char* filename = ;!!!! /* créer le widgets et lui associer sa callback */!! ok = CreateButton (...);!! RegisterCallback (ok, DoSave, (void*) &filename);!!!! /* boucle de traitement des événements */!! MainLoop ();! }! A. Bezerianos 30

«event listeners» ( Java) variante des callebacks adaptée au Java: methods de type AddListener spécifient non pas une fonction de callback, mais un objet (le listener) lorsque le widget change d état, il déclenche une méthode prédéfinie du listener (par exemple actionperformed) «event listeners» ( Java) public class ClickListener implements ActionListener {!! public void actionperformed(actionevent e){!!! JButton button = (JButton)e.getSource();!!!!! }! }!! ClickListener listener = new ClickListener();! JButton button = new JButton( Click me );! button.addactionlistener(listener);!! A. Bezerianos 31

«event listeners» ( Java) 1. Un composant (widget) qui crée des événements est appelé source 2. Le source délègue le traitement de l'événement au listener 3. Un listener doit s'inscrire auprès du composant source des événements qu'il veut traiter Un événement peut provenir : du clavier, un clique souris, un passage de la souris,.. A chaque type d événement, une classe (existante) chaque widget a son propre liste d événements A chaque type d événement, son listener (à faire) events ( Java) Selection from a list or radio button group Click on a button Select item in a menu Cursor inside text zone Cursor moving in a scrollbar Low level events A. Bezerianos 32

événements et listeners ( Java) Chaque Listener a une source (ex. JButton, JRadioButton, JCheckBox, JToggleButton,JMenu, JRadioButtonMenuItem, JTextField) On peut l acceder par la fonction getsource() Listeners doivent implémenter l'interface qui correspond à l'événement ex. ActionEvent => ActionListener : public class ClickListener implements ActionListener {!! public void actionperformed(actionevent e){!!! JButton button = (JButton)e.getSource();!!!!! }! }! événements et listeners ( Java) all events inherit from the class EventObject all listeners correspond to an interface that inherits from EventListener a class receiving notification events of some type needs to implement the corresponding interface: " ActionEvent " " " " ActionListener" MouseEvent" " " " MouseListener" KeyEvent" " " " KeyListener"..." A. Bezerianos 33

événements et listeners ( Java) listeners doivent être enregistrés (add) aux widgets un listener peut être ajouté à plusieurs widgets par exemple un auditeur gère les événements de plusieurs boutons un widget peut avoir de nombreux auditeurs par exemple un pour des événements «clic» et pour des événements «entrer» sur le bouton import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SwingDemo3 extends JFrame { JButton b1 = new JButton("Clique ici"); JButton b2 = new JButton("Clique la"); JTextField txt = new JTextField(10); inner class class ButtonListener implements ActionListener // INNER CLASS DEF. { public void actionperformed(actionevent e) { String name = ((JButton)e.getSource()).getText(); txt.settext(name); } } // END OF INNER CLASS DEFINITION ButtonListener bl = new ButtonListener(); public void init() { b1.addactionlistener(bl); b2.addactionlistener(bl); } Container cp = this.getcontentpane(); this.settitle("example 3"); cp.add(new JLabel("Swing Demo 3")); cp.setlayout(new FlowLayout()); cp.add(b1); cp.add(b2); cp.add(txt); public static void main(string[] args) { SwingDemo3 frame = new SwingDemo3(); } frame.init(); frame.setsize(200,200); frame.setvisible(true); } // end of SwingDemo3 class definition A. Bezerianos 34

«event listeners» ( Java) Anonymous Inner classes new <nom-de-classe> () { <corps> } cette construction fait deux choses : elle crée une nouvelle classe, sans nom, qui est une sous-classe de <nom-de-classe> définie par <corps> elle crée une instance (unique) de cette nouvelle classe et retourne sa valeur cette class a accès aux variables et méthodes de la class dans la quelle elle est définie! «event listeners» ( Java) Anonymous Inner classes! button.addactionlistener(new ActionListener(){!!! public void actionperformed(actionevent e){!!!!!!! }! });!! panel.addmouselistener(new MouseAdapter(){!!! public void mouseclicked(mouseevent e){!!!!!!! }! });! Fonctions et évènements prédéfinis A. Bezerianos 35

«drag-and-drop» Quels sont les «widgets» affectés? Quels sont les événements? Exercice : comment décrire cette interaction avec un «event listener»? A. Bezerianos 36