1 / 64

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

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. 3.

Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introduction aux IHM et à la réflexivité JavaVos premiers pas en Swing

  2. Modèle & Vue

  3. MODÈLE/VUE AVEC LES JLIST ET LES JTABLE 3 Il est possible de partager le modèle de données d’une JTable ou d’une JList à d’autres composants considérés comme d’autres vues de l’objet 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

  4. ILLUSTRATION 4

  5. Définition du modèle associé 5 Si le modèle est décrit par une interface ListModel / TableModel prédéfinie, L’interface permet d’expliciter comment gérer les données du modèle et d’ajouter des vues (écouteurs de changements sur le modèle) Rem : il existe généralement une classe Adapter nommée Default<X>Model avec <X>=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<…>)

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

  7. JLIST 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); 7 Exemple

  8. JLIST 8 • 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 qu’une sélection change et implémente une méthode : valueChanged

  9. JLIST : LE MODÈLE ASSOCIÉ 9 • 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)

  10. JLIST : LA VUE l 10 • Une vue d’une JList implémente l’interface 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)

  11. JLIST : PLUSIEURS VUES ?! 11 • 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 ( = d’autres 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

  12. ILLUSTRATION 12

  13. JTABLE String nomsCol[]={«Prenom», «Nom»}; String rows[][] = { {«Dinah»,«Cohen»}, … , {«Said», «Kharrazen»}}; DefaultTableModel model = new DefaultTableModel(rows, nomsCol); JTable table = new JTable(model); 13 • 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 :

  14. JTABLE : LE MODÈLE ASSOCIÉ 14 • Il existe 3 différents éléments pour créer un modèle : • L’interface 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) • …

  15. JTABLE : LA VUE 15 • Une vue implémente l’interface 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()

  16. JTABLE : PLUSIEURS VUES ?! 16 • 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

  17. Vous avez vu comment écrire la partie Modèlela partie VueReste comment mettre en place le contrôle ?

  18. Observer ObservableRappel

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

  20. 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 n’importe quel nombre d’observateurs dépendants Tous les observateurs sont informés lorsque l’état de la source change l’observateur. Chaque observateur demande à la source son état afin de se synchroniser

  21. Structure

  22. 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 d’une classe qui implémente l’interface Observer void update(Observable o, Object arg); Des listeners : ajouter des listeners, notifier les listeners avec des évenements, réagir aux événements

  23. Listeners Supported by Swing Components http://java.sun.com/docs/books/tutorial/uiswing/events/intro.html

  24. CREATION D’UN 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);     }

  25. TRAITEMENT DES EVENEMENTS {   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();    } }

  26. 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();     }

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

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

  29. HÉRITAGE DES EVÉNEMENTS 33

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

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

  32. Filtrer les événements 36 • 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 d’autres ID

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

  34. 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 l’ev. } } } 38

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

  36. LES ECOUTEURS 40 • 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

  37. Contrôle des Fenêtres 41 • 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)

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

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

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

  41. Contrôle du clavier 45 • 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 s’il la perdu • focusGained(FocusEvent e) • focusLost(FocusEvent e)

  42. Contrôle des composants 46 COMPONENTLISTENERpermet de gérer: L’apparition/disparition d’un composant • componentHidden(ComponentEvent e) • componentShown(ComponentEvent e) • Le déplacement d’un composant • componentMoved(ComponentEvent e) • Le redimensionnement d’un composant • componentResized(ComponentEvent e)

  43. COMMENT AJOUTER UN ECOUTEUR ?! 49 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 l’on souhaite avoir

  44. POUR IMPLÉMENTER LES ÉCOUTEURS 50 • 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

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

  46. 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)  {} } 52

  47. 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

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

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

  50. EVÉNEMENTS ACTIONEVENT 56 • 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

More Related