Introduction aux IHM et à la réflexivité Java Vos premiers pas en Swing.

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

1 JavaScript V0 : Nauer. 2 JavaScript Quid ? Langage de programmation lié à HTML. Code JavaScript intégré aux pages HTML. Code interprété par le navigateur.
Cours n° 7 Standard Template Library II.
Rainbow - Arcad Composition de composants et IHMs composites 23/05/2002 Jeremy Fierstone / Equipe Rainbow / 1.
Approfondissement du langage
(Classes prédéfinies – API Java)
Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir.
POO.
Les technologies XML Cours 3 : Les APIS XML Janvier Version 1.0 -
Vos premiers pas en Swing
JAV - TD 6 Structures de données JAVA
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Introduction à la POO: Les classes vs les objets
Pattern État PowerPoint 2003, télécharger la visionneuse PowerPoint Viewer dernière édition si vous ne lavez pas…télécharger la visionneuse PowerPoint.
Middleware : XML-DBMS Permet de faire office d’interface entre des données XML et des bases de données relationnelles (insertion et récupération de données)
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage.
Publispostage Menu Outils / Lettres et publipostage
Noms, classe : BarèmeNote Texte : Texte pertinent : sujet traité avec sélection des éléments essentiels textes personnels, simples, clairs avec un vocabulaire.
Historique de SystemC Regroupe 4 courants didées: SCENIC Project : Synopsys+UC Irvine Philips System-Level Data Types, VSIA SLD DWG IMEC, Hardware-Software.
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.
Structures de données IFT-2000
Graphical User Interface (GUI)
Une nouvelle structure de données : les tableaux
Introduction au paradigme orienté-objet (suite)
PROJET DE GENIE LOGICIEL 2005
Package IFT1025 Jian-Yun Nie.
Chapitre 9 Les sous-programmes.
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI1502 Principes fondamentaux en conception des logiciels
Le diagramme de collaboration
Patrons de conceptions de créations
Animateur : Med HAIJOUBI
Cours 7 Divers et exceptions. Chapitre V Enumeration, tableaux, conversion de types, noms.
Javascript 2° PARTIE : EVENEMENTS ET OBJETS
4 Introduction des objets. Les chaînes et tableaux
La notion de type revisitée en POO
Propriétés. Propriétés ► Les propriétés peuvent être visibles dans les environnements de scripts ► Les propriétés peuvent être accédées par programmation.
XML-schema. Pourquoi XML-schema Les DTD : Pas de typage, peu de contraintes sur les contenus nombre d'apparitions d'un élément à choisir entre 0 et 1.
Plan Définitions et exemples Composants de cluster
Programmation objet La base.
Le contenu est basé aux transparents du 7 ème édition de «Software Engineering» de Ian Sommerville«Software Engineering» de Ian Sommerville B.Shishedjiev.
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
Introduction à Visual Studio C++ (VC++)
Tutorat en bio-informatique
Constructeurs H Batatia. Variable statique Une variable statique est partagée par tous les objets d’une classe.
Strings et Tableaux en Java
Acquisition d’information sur internet
1 JEUX DE TESTS la méthode générale modèle de données critères fonctionnels d’extractions jeux de données jeux de données avant tests sélection exécution.
PHP objet Jérôme CUTRONA 10:13:27 Programmation Web
Les sockets.
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
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.
MJ. Blin et M. CsernelPoleInfo31 XML et ses environnements Documents XML bien formés Prologue Arbre d'éléments Attributs Commentaires Entités internes.
C# de plus près.  Ce sont globalement les mêmes que Java : ◦ Int(int16, int32), float, double, bool,…  Les classe « communes » sont également les mêmes.
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
LIFI-Java 2004 Séance du Mercredi 29 sept. Cours 4.
Introduction à la programmation objet avec java
Le diagramme de composants
© Sofia ZAIDENBERGCNRS Mai JTable. © Sofia ZAIDENBERG CNRS Mai JDBC JTable l JTable un composant Swing complexe pour présenter et éditer.
Service de vidéo à la demande Projet Tutoré : Groupe C3 Université Paris 5.
Comprendre le SGBDR Microsoft Access – partie 2
GRAPHISME PAR ORDINATEUR SIF Contenu du cours 2 Introduction à XNA –Installation de XNA 4.0 –Premier projet –Gestion des ressources (images, vidéo.
Diagramme de Composants
L. Gurret – M. Herve – P. Mignon – J. Prarioz. Introduction  Dernière étape d’analyse  Cahier des charges, spécifications et conception orientée objet.
Bargain Kevin Hardy Sebastien Lamberti Jean-Vincent Picard David.
BlueJ_VII 1 Java, les objets : tout de suite ! Conception de classes (1) Notes de cours associées au chapitre 7 tutorial BlueJ
LES CLASSES ET LES OBJETS
Transcription de la présentation:

Introduction aux IHM et à la réflexivité Java Vos premiers pas en Swing

Modèle & Vue

MODÈLE/VUE AVEC LES JLIST ET LES JTABLE Il est possible de partager le modèle de données dune JTable ou dune JList à dautres composants considérés comme dautres vues de lobjet JTable ou JList Par exemple : une liste de noms affichée dans une JList. La JList est une vue (interactive) de la liste de noms permettant la sélection délément. Une représentation tabulaire de la même liste est une autre vue Un texte qui indique le nombre déléments de la liste est une autre vue du modèle 3

ILLUSTRATION 4

Définition du modèle associé Si le modèle est décrit par une interface ListModel / TableModel prédéfinie, Linterface permet dexpliciter comment gérer les données du modèle et dajouter des vues (écouteurs de changements sur le modèle) Rem : il existe généralement une classe Adapter nommée Default Model avec =List ou Table Si le modèle change, il génère un événement et notifie les vues (via des méthodes en fire ) 5

JLIST Possède différents constructeurs : – Données fixes : JList (Vector listData) JList (Object[] listData) – Données modifiables : JList (ListModel dm) 6

JLIST Exemple 7 String listData[]= {…, " Carlos ",…, " Ramier " }; DefaultListModel model = new DefaultListModel(); for (int i=0; i<listData.length; i++) model.addElement(listData[i]); JList dataList = new JList(model); JScrollPane listeScroll = new JScrollPane(dataList);

JLIST Possède une méthode qui permet de spécifier le mode de sélection : setSelectionMode (int mode). mode peut valoir : – SINGLE_SELECTION – SINGLE_INTERVAL_SELECTION – MULTIPLE_INTERVAL_SELECTION Possède une méthode addListSelectionListener () qui écoute un ListSelectionEvent e qui est émis à chaque fois quune sélection change et implémente une méthode : valueChanged 8

JLIST : LE MODÈLE ASSOCIÉ Pour le modèle, utiliser la classe DefaultListModel. Ce modèle stocke les objets sous forme de vecteur et fournit les méthodes suivantes : – addElement (Object), – boolean contains(Object), – boolean removeElement(Object) – Object get(index), Object remove(index), int size() – addListDataListener (ListDataListener l), remove… – fireContentsChanged,fireIntervalAdded, fireIntervalRemoved (Object source, int index0, int index1) 9

JLIST : LA VUE Une vue dune JList implémente linterface ListDataListener. Il y a trois méthodes : – void contentsChanged(ListDataEvent e) : contenu de la liste a changé – void intervalAdded(ListDataEvent e) – void intervalRemoved(ListDataEvent e) 10 l

JLIST : PLUSIEURS VUES ?! Créer un modèle instance de DefaultListModel et le mémoriser. Créer ensuite la liste avec ce modèle. Pour chaque composant désirant être informé des changements ( = dautres vues ou le contrôleur) : – Mémoriser le modèle ( = le stocker dans un membre) – Implémenter ListDataListener – Enregistrer le composant dans le modèle avec addListDataListener 11

ILLUSTRATION 12

JTABLE Un constructeur possible de JTable : – JTable (Object[][] rowData, Object[] columnNames) – On peut accéder au modèle sous-jacent avec la méthode : TableModel getModel() Un autre constructeur avec directement le modèle : 13 String nomsCol[]={«Prenom», «Nom»}; String rows[][] = { {«Dinah»,«Cohen»}, …, {«Said», «Kharrazen»}}; DefaultTableModel model = new DefaultTableModel(rows, nomsCol); JTable table = new JTable(model);

JTABLE : LE MODÈLE ASSOCIÉ Il existe 3 différents éléments pour créer un modèle : – Linterface TableModel – La classe AbstractTableModel qui implémente TableModel – La classe DefaultTableModel DefaultTableModel est le plus simple à utiliser, quelques constructeurs associés : – DefaultTableModel(int row, int col) – DefaultTableModel(Object[][] data, Object[] columnNames) – DefaultTableModel(Vector data, Vector columnNames) – … 14

JTABLE : LA VUE Une vue implémente linterface TableDataListener Il y a une méthode : – void tableChanged(TableModelEvent e) Lévénement associé TableModelEvent : – int getType() : INSERT, UPDATE, DELETE – int getColumn() – int getFirstRow() – int getLastRow() 15

JTABLE : PLUSIEURS VUES ?! Créer un modèle, par exemple une instance de DefaultTableModel et le mémoriser Pour chaque composant désirant être informé des changements (les vues et/ou le contrôleur) : – Mémoriser le modèle – Implémenter TableModelListener – Enregistrer le composant dans le modèle avec : addTableModelListener 16

Vous avez vu comment écrire la partie Modèle la partie Vue Reste comment mettre en place le contrôle ?

Observer Observable Rappel

Moyen Définir une dépendance de 1 à n entre des objets telle que lorsque létat dun objet change, tous ses dépendants sont informés et mis à jour automatiquement

Besoin dévénements Le pattern Observer décrit – comment établir les relations entre les objets dépendants. Les objets-clés sont – la source Peut avoir nimporte quel nombre dobservateurs dépendants Tous les observateurs sont informés lorsque létat de la source change – lobservateur. Chaque observateur demande à la source son état afin de se synchroniser

Structure

Collaborations

Bénéfices Utilisation indépendante des sources et des observateurs. – On peut réutiliser les sources sans réutiliser les observateurs et vice- versa. – On peut ajouter des observateurs sans modifier la source et les autres observateurs. Support pour la communication broadcast – La source ne se préoccupe pas du nombre dobservateurs.

Implémentations Java du pattern Une classe et une interface : class Observable {... } et interface Observer Un objet Observable doit être une instance de la classe qui dérive de la classe Observable Un objet observer doit être instance dune classe qui implémente linterface Observer void update(Observable o, Object arg); Des listeners : ajouter des listeners, notifier les listeners avec des évenements, réagir aux événements

Observer-Observable et Listeners

Exemple de Listener jan.newmarch.name/java/replayJava/paper.htm

Listeners Supported by Swing Components ing/events/intro.html

CREATION DUN PANNEAU class ButtonPanel extends JPanel implements ActionListener // interface écouteur d'événements { private JButton Boutonjaune; private JButton BoutonBleu; private JButton BoutonRouge; PLACER DES COMPOSANTS DANS LE PANNEAU public ButtonPanel() // constructeur de la classe ButtonPanel { Boutonjaune = new JButton("Jaune"); BoutonBleu = new JButton("Bleu"); BoutonRouge = new JButton("Rouge"); // Insertion des trois boutons dans l'objet ButtonPanel add(Boutonjaune); add(BoutonBleu); add(BoutonRouge); ASSOCIER DES EVENEMENTS AUX COMPOSANTS // Les sources d'événements sont déclarées à l'écouteur Boutonjaune.addActionListener(this); BoutonBleu.addActionListener(this); BoutonRouge.addActionListener(this); }

{ public void actionPerformed(ActionEvent evt) // Permet de traiter l'événement en fonction de l'objet source { Object source = evt.getSource(); Color color = getBackground(); if (source == Boutonjaune) color = Color.yellow; else if (source == BoutonBleu) color = Color.blue; else if (source == BoutonRouge) color = Color.red; setBackground(color); repaint(); } } TRAITEMENT DES EVENEMENTS

CREATION DE LA FENETRE ET PLACEMENT DU PANNEAU class ButtonFrame extends JFrame { public ButtonFrame() { setTitle("ButtonTest"); setSize(300, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); Container contentPane = getContentPane(); contentPane.add(new ButtonPanel()); } } public class ButtonTest { public static void main(String[] args) { JFrame frame = new ButtonFrame(); frame.show(); }

LE CONTRÔLEUR Zoom sur les événements et les Listeners 31

LE CONTRÔLEUR Des types dévénements Des écouteurs associés Méthodes pour implémenter les écouteurs Evénements Sémantiques Les Actions 32

HÉRITAGE DES EVÉNEMENTS 33

Exemples dévénements Définis dans java.awt.event – FocusEvent : activation ou désactivation du focus du clavier – MouseEvent : mouvement et clics de souris, et entrer/sortir dun composant – KeyEvent : événements clavier – WindowEvent : dés/activation, ouverture, fermeture, dés/iconification de fenêtres – ComponentEvent : changement de taille, position ou visibilité dun composant 34

AWTEvent dérive de java.util.EventObject contient par héritage – getSource() qui renvoie la source de lévénement (objet où lévénement sest produit) définit des constantes permettant didentifier des classes dévénements : – MOUSE_EVENT_MASK – MOUSE_MOTION_EVENT_MASK – WINDOW_EVENT_MASK – … 35

Filtrer les événements Une méthode ENABLEEVENTS() – Les ID (types dévénements particuliers) correspondants dans WindowEvent : WINDOW_OPENED, WINDOW_CLOSING, … – Pour les autres classes dévénements, il a dautres ID 36

UTILISER ENABLEEVENTS() Utilisation : 1.Appeler enableEvent () sur le composant avec des masques AWTEvent 2.Implémenter les méthodes correspondantes, i.e : processEvent ( AWTEvent e) processMouseEvent ( MouseEvent e) … 37

GESTION GLOBALE AVEC ENABLEEVENTS() public class toto extends JFrame { public toto() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING){ dispose(); // libère les ressources System.exit(0); } super.processWindowEvent( e ): // Passe lev. } 38

LES ECOUTEURS Depuis (JAVA 1.1) – interfaces écouteurs correspondants aux masques dévénements principaux. – extensions de java.util.EventListener. 39

LES ECOUTEURS – WindowListener : pour les événements de la fenêtre – MouseListener : pour les clics et entrées/sorties fenêtre – MouseMotionListener : pour les mouvements de la souris – KeyListener : pour les touches clavier – FocusListener : pour le focus clavier – ComponentListener : pour la configuration du composant 40

Contrôle des Fenêtres WINDOWSLISTENER Concerne tout ce qui est en rapport avec la fenêtre : – Ouvrir, fermer, réduire, agrandir, windowActivated(WindowEvent e) - clic windowDeactivated(WindowEvent e) windowClosed(WindowEvent e) windowOpened(WindowEvent e) 1ere fois windowClosing(WindowEvent e) menu fermé du système windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) 41

Contrôle de la souris MouseListener : Gestion des états de la souris : – Clic, Pressé, Relâché – Et également lentrée/sortie sur un composant mouseClicked(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) 42

Gestion des mouvements MouseMotionListener : Mouvements de la souris sur un composant avec bouton appuyé ou relâché mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) 43

MOUSEINPUTLISTENER interface écouteur de javax.swing.event. – Implémente un MouseListener et un MouseMotionListener ATTENTION : il nexiste pas de méthode addMouseInputListener il faut enregistrer lécouteur deux fois : – avec addMouseListener – et avec addMouseMotionListener 44

Contrôle du clavier KEYLISTENER – concerne tout ce qui est en rapport avec le clavier : tapé, pressé, relâché…. keyPressed(KeyEvent e) keyReleased(KeyEvent e) keyTyped(KeyEvent e) FOCUSLISTENER – gère le focus - savoir si un composant a obtenu le focus ou sil la perdu focusGained(FocusEvent e) focusLost(FocusEvent e) 45

Contrôle des composants COMPONENTLISTENER permet de gérer: Lapparition/disparition dun composant componentHidden(ComponentEvent e) componentShown(ComponentEvent e) – Le déplacement dun composant componentMoved(ComponentEvent e) – Le redimensionnement dun composant componentResized(ComponentEvent e) 46

EXEMPLE DUTILISATION DES ECOUTEURS (1/2) public class Sketcher implements WindowListener { private static SketcherFrame window; // fenêtre de lapplication private static Sketcher theApp; // Lobjet application public static void main (String[] args) { theApp = new Sketcher(); theApp.init(); } public void init() { window = new SketcherFrame(«Dessin»); Toolkit leKit = window.getToolkit(); Dimension wndSize = leKit.getScreenSize(); window.setBounds(wndSize.width/6, wndSize.height/6, 2*wndSize.width/3,2*wndSize.height/3); window.addWindowListener(this); window.setVisible(true); } 47

EXEMPLE DUTILISATION DES ECOUTEURS (2/2) // Méthode pour lévénement windowClosing public void windowClosing(WindowEvent e ) { window.dispose(); // libère les ressources de la fenêtre System.exit(0); // termine lapplication } // fonctions de linterface listener que nous devons implémenter // mais dont nous navons pas besoin … public void windowOpened(WindowEvent e ) {}; public void windowClosed(WindowEvent e ) {}; public void windowIconified(WindowEvent e ) {}; public void windowDeiconified(WindowEvent e ) {}; public void windowActivated(WindowEvent e ) {}; public void windowDeactivated(WindowEvent e ) {}; } // dans SketcherFrame // on supprime setDefaultCloseOperation(EXIT_ON_CLOSE); 48

COMMENT AJOUTER UN ECOUTEUR ?! Pour ajouter un écouteur, on utilise la méthode addXXXListener (XXXListener l) sur le composant désiré Il suffit alors de remplacer les XXX parce que lon souhaite avoir 49

POUR IMPLÉMENTER LES ÉCOUTEURS Il existe plusieurs méthodes – Etendre une classe Adapter ou implémenter une interface Listener – Définir des classes internes – Définir des classes anonymes 50

ETENDRE UNE CLASSE ABSTRAITE public class MaClass extends MouseAdapter {... unObject.addMouseListener(this);... public void mouseClicked(MouseEvent e) {... // limplementation de la méthode // associée à lévénement vient ici... } 51

IMPLÉMENTER UNE INTERFACE public class MaClass implement MouseListener {... unObject.addMouseListener(this);... void mouseClicked(MouseEvent e) {} void mouseEntered(MouseEvent e) {} void mouseExited(MouseEvent e) {} void mousePressed(MouseEvent e) {} void mouseReleased(MouseEvent e) {}mouseClickedMouseEventmouseEnteredMouseEventmouseExitedMouseEventmousePressedMouseEventmouseReleasedMouseEvent } 52

DÉFINIR UNE CLASSE INTERNE window.addWindowListener(new WindowHandler()); // classe interne WindowHandler // pour les événements de fermeture class WindowHandler extends WindowAdapter { // Méthode pour WINDOW_CLOSING event public void windowClosing( WindowEvent e ) { window.dispose(); System.exit(0); } 53

DÉFINIR UNE CLASSE ANONYME button = new JButton("test"); button.addMouseListener(new MouseAdapter() public void mouseClicked (MouseEvent e) { // code que l'on souhaite effectuer } }); 54

EVÉNEMENTS SÉMANTIQUES Ces trois événements sémantiques sont dans : java.awt.event 55

EVÉNEMENTS ACTIONEVENT une action sur un composant réactif : – Clic sur un item de menu, – Clic sur un bouton, – … émis par les objets de type : – Boutons : JButton, JToggleButton, JCheckBox – Menus : JMenu, JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem … – Texte : JTextField 56

EVÉNEMENTS : ITEMEVENT composant sélectionné ou désélectionné émis par les objets de type : – Boutons : JButton, JToggleButton, JCheckBox – Menus : JMenu, JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem – Mais aussi JComboBox, JList 57

EVÉNEMENTS ADJUSTMENTEVENT Se produisent quand un élément ajustable comme une JScrollBar sont ajustés Sont émis par ScrollBar, JScrollBar 58

ECOUTEURS ASSOCIÉS AUX EVÉNEMENTS SÉMANTIQUES Chaque interface contient une unique méthode : – ActionListener : void actionPerformed(ActionEvent e) – ItemListener : void itemStateChanged(ItemEvent e) – AdjustementListener : void adjustementValueChanged (AdjustementEvent e) 59

EXEMPLE (1/2) Cette applet contrôle lapparition dune fenêtre supplémentaire (un JFrame) qui apparaît lorsque lon enfonce le bouton Start playing… 60

EXEMPLE (2/2) Dans le JFrame on trouvera un label et une checkbox qui permettra de cocher si le label est rendu visible ou invisible On pourra aussi iconifier le JFrame ou non Les différent événements captés écriront leur source et leur type au centre du cadre de lapplet précédent dans la zone de texte 61

SOURCE DE LEXEMPLE PARTIE 1 (1/4) public class ComponentEventDemo extends JApplet implements ComponentListener, ActionListener { JTextArea display; JFrame aFrame; // une fenêtre supplémentaire à afficher public boolean showIt = false; final static String SHOW = "show"; final static String CLEAR = "clear"; String newline = "\n"; public void init() { display = new JTextArea(); display.setEditable(false); JScrollPane scrollPane = new JScrollPane(display); scrollPane.setPreferredSize(new Dimension(200, 75)); getContentPane().add(scrollPane, BorderLayout.CENTER); JButton b1 = new JButton("Start playing..."); b1.setActionCommand(SHOW); b1.addActionListener(this); getContentPane().add(b1, BorderLayout.NORTH); 62

SOURCE DE LEXEMPLE PARTIE 1 (2/4) JButton b2 = new JButton("Clear"); b2.setActionCommand(CLEAR); b2.addActionListener(this); getContentPane().add(b2, BorderLayout.SOUTH); aFrame = new JFrame("A Frame"); // une autre fenêtre ComponentPanel p = new ComponentPanel(this); // défini + loin aFrame.addComponentListener(this); // aFrame écoute l'Applet p.addComponentListener(this); // et son propre panneau aFrame.getContentPane().add(p, BorderLayout.CENTER); aFrame.pack(); aFrame.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { showIt = false; } }); } // fin de init() 63

SOURCE DE LEXEMPLE PARTIE 1 (3/4) public void actionPerformed(ActionEvent e) { // sur les boutons if (e.getActionCommand() == SHOW) { showIt = true; aFrame.setVisible(true); } else { // CLEAR display.setText(""); // efface le contenu central } public void start() { SwingUtilities.invokeLater(new Runnable() { public void run() { if (showIt) { aFrame.setVisible(true); } }); } 64

SOURCE DE LEXEMPLE PARTIE 1 (4/4) protected void displayMessage(String message) { display.append(message + newline); } public void componentHidden(ComponentEvent e) { displayMessage("componentHidden event from " + e.getComponent().getClass().getName()); } public void componentMoved(ComponentEvent e) { displayMessage("componentMoved event from " + e.getComponent().getClass().getName()); } public void componentResized(ComponentEvent e) { … } public void componentShown(ComponentEvent e) { … } } // fin de ComponentEventDemo 65

SOURCE DE LEXEMPLE PARTIE 2 (1/2) class ComponentPanel extends JPanel implements ItemListener { // contenu de "aFrame" JLabel label; JCheckBox checkbox; ComponentPanel(ComponentEventDemo listener) { super(new BorderLayout()); // sinon c'est un FlowLayout label = new JLabel("This is a Label", JLabel.CENTER); add(label, BorderLayout.CENTER); checkbox = new JCheckBox("Label visible", true); checkbox.addItemListener(this); add(checkbox, BorderLayout.SOUTH); label.addComponentListener(listener); // listener = le JApplet checkbox.addComponentListener(listener); } 66

SOURCE DE LEXEMPLE PARTIE 2 (2/2) public void itemStateChanged(ItemEvent e) { // pour la checkbox if (e.getStateChange() == ItemEvent.SELECTED) { label.setVisible(true); // Selon les tutorials sun // Il faut parfois appeler revalidate et repaint // pour assurer le bon affichage du label label.revalidate(); // mise à jour de l'interface label.repaint(); // demande explicite de réaffichage } else { label.setVisible(false); } 67

AUTRES EVÉNEMENTS SÉMANTIQUES Il existe dautres événements sémantiques comme par exemple : – Une JList génère des SelectionEvent – Les modèles associés aux listes et aux tables génèrent des ListDataEvent et des TableModelEvent (envoyés aux vues quand des changements se produisent sur le modèle) 68

AUTRES EVÉNEMENTS SÉMANTIQUES Il existe dautres événements sémantiques comme par exemple : – Les sous-classes de AbstractButton peuvent générer des événements ChangeEvent quand on modifie létat dun bouton – Les dérivés de JMenuItem génèrent des MenuDragMouseEvent et des MenuKeyEvent 69

LES ACTIONS : CONCEPT Une action est objet de nimporte quelle classe qui implémente linterface Action. Linterface déclare des méthodes qui opèrent sur un objet Action Linterface Action étend linterface ActionListener donc un objet Action est aussi un écouteur dévénement daction de type ActionEvent 70

LES ACTIONS : PRINCIPE Les composants Swing suivants possèdent une méthode add() qui prend en argument un type Action : – JMenu, – JPopupMenu, – JToolBar 71

LES ACTIONS : PRINCIPE un add() dun objet Action sur un menu ou une barre doutils crée un composant à partir de lobjet Action qui est du bon type par rapport au composant auquel on lajoute (i.e. item de menu ou bouton) – ajout à un JMenu, add() ajoute un JMenuItem au menu. ajoute à une JToolBar, cest un JButton qui lui sera ajouté lobjet Action est comme son propre écouteur, le bouton et litem de menu supporteront la même procédure daction. 72

PROPRIÉTÉS LIÉES À ACTION.Il y a 7 propriétés standards qui caractérisent un objet implémentant linterface Action : – NAME : String – SMALL_ICON : Icon (pour la toolbar) – SHORT_DESCRIPTION : String (pour le tooltip) – ACCELERATOR_KEY : KeyStroke (accélérateur) – LONG_DESCRIPTION : String (aide contextuelle) – MNEMONIC_KEY : int (mnémonique de laction) – ACTION_COMMAND_KEY : (keymap associée au comp.) La classe Property est dans java.util. 73

void putValue (String key, Object value) : associe lobjet value avec la clé key dans le dictionnaire pour lobjet Action Exemple : pour stocker un nom daction putValue(NAME, leNom) (On utilise la clé standard NAME pour stocker lobjet leNom) Object getValue (String key) : retourne lobjet correspondant à la clé key dans le dictionnaire. Pour retrouver licône de la toolbar dans une méthode dune classe daction : Icon lineIcon = (Icon) getValue (SMALL_ICON) 74

boolean isEnabled() : retourne true si lobjet daction est actif et accessible void setEnabled(boolean state) : permet dagir à la fois sur le bouton de la barre doutils et lélément de menu si tous deux ont été créés à partir de la même action void addPropertyChangeListener (PropertyChangeListener l) : ajoute un listener qui écoute les changements de propriétés (état dactivation). Utilisé par les conteneurs void removePropertyChangeListener (PropertyChangeListener listener) 75

ABSTRACTACTION Est défini dans le package javax.swing et implémente linterface Action Fournit des mécanismes pour stocker les propriétés dune action Possède trois constructeurs : – AbstractAction ( ) – AbstractAction ( String name ) – AbstractAction ( String name, Icon icon) 76

EXEMPLE DUTILISATION DACTION (1/3) class FileAction extends AbstractAction { // définit les actions FileAction(String name) { // pour les items super(name); // du menu File } FileAction(String name, KeyStroke keystroke) { this(name); if(keystroke != null) putValue(ACCELERATOR_KEY, keystroke); } public void actionPerformed(ActionEvent e) { // code pour les actions liées aux items du menu File } 77

EXEMPLE DUTILISATION DACTION (2/3) public class SketchFrame extends JFrame { private FileAction newAction, openAction, saveAction; public SketchFrame(String title) { setTitle(title); setJMenuBar(menuBar); setDefaultCloseOperation(EXIT_ON_CLOSE); JMenu fileMenu = new Jmenu("File"); JMenu elementMenu = new JMenu("Elements"); fileMenu.setMnemonic(F); elementMenu.setMnemonic(E); // On construit ici le file menu avec des actions… newAction = new FileAction("New", Keystroke.getKeystroke(N,Event.CTRL_MASK)); addMenuItem(fileMenu, newAction); 78

EXEMPLE DUTILISATION DACTION (3/3) // pour rajouter laction à la barre d'outils: toolBar.add(newAction); // remarque: pour rajouter son icône, il faudra dabord lajouter à laction newAction.putValue(Action.SMALL_ICON, new ImageIcon("new.gif")); JButton bouton = toolBar.add(newAction); // et supprimer le label du bouton dicône bouton.setText(null); // si on avait joué sur le nom (NAME) de l'action, on // aurait perdu le label de texte dans l'item du menu …} private JMenuItem addMenuItem(JMenu menu, Action action) { JMenuItem item = menu.add(action); KeyStroke keystrocke = (KeyStroke) action.getValue(action.ACCELERATOR_KEY); if (keystroke != null) item.setAccelerator(keystroke); return item; } 79