La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1 Cours JAVA / Y.Laborde Java : Interface Homme-Machine LES CONCEPTS de LIHM : Introduction LAWT (Abstract Window Toolkit) le package java.awt les composants.

Présentations similaires


Présentation au sujet: "1 Cours JAVA / Y.Laborde Java : Interface Homme-Machine LES CONCEPTS de LIHM : Introduction LAWT (Abstract Window Toolkit) le package java.awt les composants."— Transcription de la présentation:

1

2 1 Cours JAVA / Y.Laborde Java : Interface Homme-Machine LES CONCEPTS de LIHM : Introduction LAWT (Abstract Window Toolkit) le package java.awt les composants graphiques les conteneurs de composants les gestionnaires de mise en forme création dune application Java avec Frame le package java.awt.event létablissement de liens entre les composants actifs et lapplicatif

3 2 Cours JAVA / Y.Laborde Java : IHM / Introduction Les IHM (Interfaces Homme-Machine) regroupent tout ce qui entre en jeu pour assurer une interaction entre les utilisateurs et les applicatifs. Cela comprend aussi bien les aspects visuels purement graphiques (fenêtres, boutons, …) que comportementaux (déroulement dune liste, déclenchement dune action, …) et procéduraux (traitement lié à une action, …). De nos jours, les IHM sont fortement standardisées. Leur mise en œuvre met en jeu de nombreuses couches logicielles. Prenant lexemple dapplicatifs Java, on trouve : le système dexploitation (SE), le gestionnaire de fenêtres (WM pour window manager), la machine virtuelle Java (JVM), les composants graphiques et leurs traitements spécifiques depuis lapplicatif. Lobjectif, poursuivit depuis de nombreuses années, quant à la standardisation des IHM est dun enjeu majeur en matière de portabilité des applications. Les SE proposent aujourdhui une interface graphique commune pour les utilisateurs (GUI pour graphical user interface) et sont basées sur un principe événementiel qui permet dassurer linteraction entre les différentes couches logicielles. Les événements passent toujours par le gestionnaire de fenêtres (WM) qui a pour rôle den effectuer le routage correct vers les couches supérieures.

4 3 Cours JAVA / Y.Laborde Java : IHM / Introduction Dans une optique Orientée Objet, le langage Java intègre aujourdhui une JVM masquant presque totalement le WM sur lequel il sappuie. Pour réaliser cela, tous les événements du WM sont systématiquement encapsulés par la JMV. De plus, la JVM, possédant également des composants qui lui sont propres, peut fabriquer des nouveaux événements non issus du WM. Les événements encapsulés par la JVM se présentent donc aux applications Java comme de véritables objets Java. Une application dite 100% pure Java est telle que ses aspects visuels et comportementaux (look and feel) ne dépendent que de la JVM et en aucun cas du WM (on pourrait même changer dynamiquement de look and feel pendant lexécution si cela présentait un intérêt !). En pratique, on peut croire linverse car Java conserve par défaut laspect du système hôte auquel lutilisateur est habitué ; si bien que le look Java nexiste pas vraiment. Il est à remarquer que ces aspects ne sont pas totalement nouveaux puisque déjà proposés par les concepteurs du langage Smalltalk depuis les années 80 (qui reste une référence en matière de LOO et dIHM). Malgré tout, Java est un langage objet moderne typé très convainquant par sa spécification, son intégration au système, sa portabilité, son intégrabilité et son évolutivité.

5 4 Cours JAVA / Y.Laborde Applicatif JAVA JVM Applicatif standard en C WM Java : IHM / Introduction SE click Evénement Click sur le bouton (FONCTION en C) WM SE click Evénement Click sur le bouton (FONCTION en C) Evénement Click sur le bouton (OBJET JAVA) Tous les événements du WM sont systématiquement encapsulés par la JMV. Les applicatifs Java reçoivent des objets Java. Code C Code Java dessin action Traite- ment

6 5 Cours JAVA / Y.Laborde Java : AWT / le package java.awt Object FlowLayout BorderLayout GridLayout CardLayout GrisBagLayout Gestionnaires de mise en forme abstract Toolkit abstract … MenuComponent MenuBar MenuItem Menu CheckboxMenuItem PopupMenu Menus … Les quatre principaux sous-groupes du package java.awt abstract Component Button Checkbox Choice List TextComponent TextArea TextField Canvas Composants simples Label Panel Window ScrollPane Dialog Frame Conteneurs de composants Container

7 6 Cours JAVA / Y.Laborde Java : AWT / le package java.awt Les composants graphiques Les composants simples sont les formes visibles dune application. Ils comprennent dune part les labels, les boutons, les cases à cocher, les boutons de choix, les listes et les zones de texte et dautre part les canvas. Tous dérivent de la classe Component dont ils tirent leurs propriétés de base. public abstract class java.awt.Component extends Object implements ImageObserver, MenuContainer, Serializable Un composant est un objet ayant une représentation graphique pouvant être dessinée à lécran et capable dinteragir avec lutilisateur. Cependant, la classe Component nest pas instanciable. Par contre, elle peut être dérivée pour former un "composant léger" (i.e. qui nest pas associé à une fenêtre native opaque). Cela est à différencier du composant Canvas utilisé par une application pour dessiner de sa propre manière. En effet, un canvas possède une représentation graphique minimale consistant à rafraîchir son fond (de couleur blanche). abstract ObjectComponent…

8 7 Cours JAVA / Y.Laborde CONSTRUCTEURS : protected Component () String toString () void setVisible (boolean b) void setEnabled (boolean b) String getName ()void setName (String name) Dimension getSize ()void setSize (int width, int height) Dimension getMinimumSize ()void setBackground (Color c) Dimension getMaximumSize ()void setForeground (Color c) Font getFont ()void setFont(Font f) Graphics getGraphics () void paint (Graphics g)void repaint () void repaint (int x, int y, int width, int height) void addKeyListener (KeyListener l)void addFocusListener (FocusListener l) void addMouseListener (MouseListener l)void addMouseMotionListener (MouseMotionListener l) void addComponentListener (ComponentListener l) PRINCIPALES METHODES : public abstract class java.awt.Component extends Object implements ImageObserver, MenuContainer, Serializable

9 8 Cours JAVA / Y.Laborde Java : AWT / le package java.awt Les conteneurs de composants public class java.awt.Container extends Component (implements ImageObserver, MenuContainer, Serializable) Les conteneurs sont des composants capables de contenir dautres composants et deffectuer sur cet ensemble des opérations complexes comme le placement des composants les uns par rapport aux autres, leurs re-dimensionnements, etc. Les références aux composants ajoutés sont placés dans une liste. Si aucun index nest spécifié au moment de lajout, le composant est ajouté à la fin de la liste. Bien quinstanciable, cette classe ne lest généralement pas.Elle est plus considérée comme une classe générique dont les fenêtres applicatives, les boîtes de dialogue, etc…tirent leurs propriétés de base. abstract ObjectComponentContainer

10 9 Cours JAVA / Y.Laborde CONSTRUCTEURS : Container () Component add (Component comp)void add (Component comp, Object constraints) Component add (Component comp, int index)void add (Component comp, Object constraints, int index) void add ContainerListener(ContainerListener l) void remove (Component comp)void remove (int index) void setLayout (LayoutManager mgr)void doLayout () Dimension getPreferredSize () void paintComponents (Graphics g)void print (Graphics g) PRINCIPALES METHODES : public class java.awt.Container extends Component implements ImageObserver, MenuContainer, Serializable

11 10 Cours JAVA / Y.Laborde Java : AWT / le package java.awt Le conteneur Frame public class java.awt.Frame extends Window implements MenuContainer (, Accessible, ImageObserver, MenuContainer, Serializable) Cest le conteneur de base de toute application autonome (stand alone) puisquil représente une fenêtre applicative (top level window) avec au minimum un encadrement et une barre de titre. Les Frame ont une représentation héritée du système (ou du WM) sur lequel lapplication « tourne ». En particulier leur barre de titre contient les boutons daccès au menu système ainsi que ceux de minimisation ou de maximisation. Les Frame sont ainsi capables de générer les types suivants dévénement : WindowOpened, WindowClosing, WindowClosed, WindowIconified, WindowDeiconified, WindowActivated, WindowDeactivated. En fin de construction, les Frame restent invisibles. Ce sont les seules fenêtres qui peuvent contenir une barre de menus. abstract ObjectComponentContainerWindowFrame

12 11 Cours JAVA / Y.Laborde PRINCIPAUX CONSTRUCTEURS : Frame ()Frame (String title) String getTitle ()void setTitle (String title) boolean isResizable ()void setResizable (boolean resizable) int getState ()void setState (int state) MenuBar getMenuBar ()void setMenuBar (MenuBar mb) Image getIconImage ()void setIconImage (Image image) PRINCIPALES METHODES : public class java.awt.Frame extends Window implements MenuContainer (, Accessible, ImageObserver, MenuContainer, Serializable)

13 12 Cours JAVA / Y.Laborde Java : AWT / le package java.awt Le conteneur Dialog public class java.awt.Dialog extends Window (implements Accessible, ImageObserver, MenuContainer, Serializable) Les boîtes de dialogues représentent des fenêtres permettant de recevoir des données en provenance de lutilisateur. Elles sont utilisées pour : configurer lapplicatif, informer lutilisateur sur létat de lapplicatif, saisir des données. Les boîtes de dialogues peuvent être : -modales (modal), i.e. bloquantes vis-à-vis de la fenêtre mère. Il faudra refermer le dialogue (pop up) pour réactiver les composants de la fenêtre mère, -non modales, i.e. leur exécution est simultanée avec la fenêtre parente. La fenêtre mère doit toujours être une fenêtre Frame si bien quun dialogue sera toujours fermé ou minimisé parallèlement à sa Frame. En fin de construction, les Dialog restent invisibles. Les Dialog sont capables de générer les mêmes types dévénement que les Frame : WindowOpened, WindowClosing, WindowClosed, WindowIconified, WindowDeiconified, WindowActivated, WindowDeactivated. abstract ObjectComponentContainerWindowDialog

14 13 Cours JAVA / Y.Laborde CONSTRUCTEURS : Dialog (Dialog owner)Dialog (Dialog owner, String title) Dialog (Dialog owner, String title, boolean modal) Dialog (Frame owner)Dialog (Frame owner, String title) Dialog (Frame owner, String title, boolean modal) Dialog (Frame owner, boolean modal) void show ()void hide () String getTitle ()void setTitle (String title) boolean isResizable ()void setResizable (boolean resizable) boolean isModal ()void setModal (boolean b PRINCIPALES METHODES : public class java.awt.Dialog extends Window (implements Accessible,ImageObserver, MenuContainer, Serializable)

15 14 Cours JAVA / Y.Laborde Java : AWT / le package java.awt Le conteneur Window public class java.awt.Window extends Container implements Accessible (, ImageObserver, MenuContainer, Serializable) Ce conteneur représente une classe de base pour les fenêtres autonomes (top level window). Il ne définit ni encadrement, ni menu pour la fenêtre si bien quil peut être utilisé pour des fenêtres spéciales telles que les menus contextuels. Suivant les systèmes, les fenêtres Window actives prennent toujours le focus vis-à-vis des autres applications i.e. elles sapproprient les entrées en provenance du clavier. Une Window doit toujours être construite à laide dune fenêtre Frame, dun Dialog ou dune autre Window. En fin de construction, les Window restent invisibles. Les Window ne sont capables de générer que les types suivants dévénement : WindowOpened, WindowClosed. abstract ObjectComponentContainerWindow

16 15 Cours JAVA / Y.Laborde PRINCIPAUX CONSTRUCTEURS : Window (Frame owner) Window (Window owner) void show ()void hide ()void dispose () void toFront ()void toBack () boolean isShowing () void pack () void setCursor (Cursor cursor) Window getOwner ()Window[] getOwnedWindows () void addWindowListener (WindowListener l) void removeWindowListener (WindowListener l) void setVisible(boolean b) PRINCIPALES METHODES : public class java.awt.Window extends Container implements Accessible (, ImageObserver, MenuContainer, Serializable)

17 16 Cours JAVA / Y.Laborde Java : AWT / le package java.awt Le conteneur ScrollPane public class java.awt.ScrollPane extends Container implements Accessible (, ImageObserver, MenuContainer, Serializable) Ce conteneur permet de prendre en charge le défilement (scrolling) à lintérieur dun (et dun seul) composant attaché. Les opérations de défilement sont alors reliées au composant attaché. Les barres de défilement peuvent être soit : vues au besoin, toujours vues ou jamais vues. Elles implémentent linterface Ajustable permettant de manipuler les attributs du défilement comme lunité de défilement, la position, etc. Leur taille initiale est de 100x100 pixels, mais ils peuvent être redimensionnés à laide de la méthode setSize(). Leur dimension est accessible à laide de la méthode getInsets() qui fournit lespace utilisé par les bordures ainsi que les scrollbars lorsquelles sont présentes. Lorsque les scrollbars sont définies jamais vues, le défilement peut être réalisé par programmation. Un ScrollPane est visible dès que le conteneur qui le contient le devient (à moins davoir explicitement été rendu invisible). abstract ObjectComponentContainerScrollPane

18 17 Cours JAVA / Y.Laborde CONSTRUCTEURS : ScrollPane ()ScrollPane (int scrollbarDisplayPolicy) protected void addImpl (Component comp, Object constraints, int index) Point getScrollPosition ()void setScrollPosition (int x, int y) void setScrollPosition (Point p) int getScrollbarDisplayPolicy () Dimension getViewportSize () void doLayout () Adjustable getHAdjustable ()Adjustable getVAdjustable () int getHScrollbarHeight ()int getVScrollbarWidth () PRINCIPALES METHODES : public class java.awt.ScrollPane extends Container implements Accessible (, ImageObserver, MenuContainer, Serializable)

19 18 Cours JAVA / Y.Laborde Java : AWT / le package java.awt Le conteneur Panel public class java.awt.Panel extends Container implements Accessible (, ImageObserver, MenuContainer, Serializable) Cette classe permet dinstancier le plus simple des conteneurs i.e. une fenêtre ne disposant ni dencadrement, ni de barre de titre, ni de menu... mais permettant de contenir dautres composants ou conteneurs. La classe Panel : -est très utile pour gérer limbrication de multiples composants et conteneurs dans une fenêtre (ou une portion de fenêtre par imbrication de plusieurs Panels), -est la classe de base des Applets (toute Applet est une sorte de Panel). Par défaut, un Panel noffre pas de représentation à lécran et est souvent utilisé tel quel. Il est toutefois possible de lui faire dessiner son fond dune certaine couleur. Son gestionnaire de mise en forme par défaut est le FlowLayout. Un Panel est visible dès que le conteneur qui le contient le devient (à moins davoir explicitement été rendu invisible). Lorsquun Panel est visible, il rend visible tous les composants quil contient. abstract ObjectComponentContainerPanel

20 19 Cours JAVA / Y.Laborde CONSTRUCTEURS : Panel ()Panel (LayoutManager layout) public class java.awt.Panel extends Container implements Accessible (, ImageObserver, MenuContainer, Serializable)

21 20 Cours JAVA / Y.Laborde Java : AWT / le package java.awt Les gestionnaires de mise en forme Les gestionnaires de mise en forme (layout manager) sont des objets associés à des conteneurs et qui se chargent de gérer la taille et la disposition relative des composants appartenant aux conteneurs. Prenons lexemple de la fenêtre ci-dessous : Ses sept composants doivent être positionnés et dimensionnés dans lespace du Panel. Or, ces opérations deviennent vite très complexes dès lors que le nombre de composants augmente, que leur taille est variée ou que la fenêtre est redimensionnable ! Ce sont justement ces deux aspects que les gestionnaires de mise en forme nous permettent dautomatiser !

22 21 Cours JAVA / Y.Laborde Java : Les gestionnaires de mise en forme Le gestionnaire de mise en forme FlowLayout public class java.awt.FlowLayout extends Object implements LayoutManager, Serializable Ce LayoutManager arrange et dimensionne ses composants à la manière dun texte i.e. de gauche à droite sur une ligne avec passage à la ligne suivante sil y a lieu. Il est typiquement utilisé pour placer des boutons dans un Panel. Il laisse toujours les composants à leur taille préférée (pour un bouton, elle est proportionnelle à la largeur de son texte). Cest le gestionnaire par défaut des conteneurs. Il ny a donc normalement pas besoin de linstancier sauf si lon désire en modifier le paramétrage. ObjectFlowLayout (gestionnaire par défaut) CONSTRUCTEURS : FlowLayout ()FlowLayout (int align)FlowLayout (int align, int hgap, int vgap) VARIABLES de CLASSE : (public static final) int LEFT, CENTER, RIGHT, LEADING, TRAILING Les variables de classes sont utiles pour fixer les paramètres (int align) des constructeurs.

23 22 Cours JAVA / Y.Laborde Java : Le LayoutManager FlowLayout import java.awt.Button; public class MyThreeButtonsPanel extends Panel { public MyThreeButtonsPanel () { this.setLayout (new FlowLayout (FlowLayout.CENTER,4,4)); Button b = new Button ("Ok"); this.add (b); b = new Button ("Open"); this.add (b); b = new Button ("Close"); this.add (b); } CloseOpenOk EXEMPLE :

24 23 Cours JAVA / Y.Laborde Java : Les gestionnaires de mise en forme Le gestionnaire de mise en forme BorderLayout public class java.awt.BorderLayout extends Object implements LayoutManager2, Serializable Ce LayoutManager arrange et dimensionne ses composants relativement à un maximum de cinq régions repérées par les quatre directions cardinales plus le centre. Il est utilisé dans de très nombreux cas car il permet de nombreuses configurations du fait que lon peut utiliser ou non toutes les régions. Il ajuste la taille des composants à celles des régions dans lesquelles ils sont insérés La région du centre est toujours la plus importante (dans un rapport de 1/3 à 1/2 des autres régions) si elle est présente ; les régions des bords se partagent le reste de la surface mais elles peuvent également être disproportionnées entre elles dans le cas où tous les composants dune région sont de faibles dimensions préférées. Lors de lajout dun composant dans un conteneur, il faut préciser la région désirée. ObjectBorderLayout CONSTRUCTEURS : BorderLayout ()BorderLayout (int hgap, int vgap) VARIABLES de CLASSE : (public static final) int NORTH, SOUTH, EAST, WEST, CENTER String AFTER_LAST_LINE, AFTER_LINE_ENDS, BEFORE_FIRST_LINE, BEFORE_LINE_BEGINS

25 24 Cours JAVA / Y.Laborde Java : Le LayoutManager FlowLayout import java.awt.Button; public class MyFourButtonsPanel extends Panel { public MyFourButtonsPanel () { this.setLayout (new BorderLayout (4,4)); Button b = new Button ("North"); this.add (b, BorderLayout.NORTH ); b = new Button ("East"); this.add (b, BorderLayout.EAST ); b = new Button ("Center"); this.add (b, BorderLayout.CENTER ); b = new Button ("West"); this.add (b, BorderLayout.West ); } EXEMPLE : North CenterWestEast

26 25 Cours JAVA / Y.Laborde Java : Les gestionnaires de mise en forme Le gestionnaire de mise en forme GridLayout public class java.awt.GridLayout extends Object implements LayoutManager, Serializable Ce LayoutManager arrange et dimensionne ses composants relativement à une grille 2D rectangulaire de dimensions variables à la construction (nombre de lignes et de colonnes). Il divise ainsi lespace du conteneur en rectangles de tailles égales (largeur, hauteur). Par ailleurs, à chaque rectangle de la grille peut être associé un composant ou un nouveau conteneur. Lordre dajout ne peut pas être précisé à laide des constructeurs. Le GridLayout procède à un ajout par lignes (de gauche à droite en commençant par de haut puis en descendant). ObjectGridLayout CONSTRUCTEURS : GridLayout () GridLayout (int rows, int cols) GridLayout (int rows, int cols, int hgap, int vgap)

27 26 Cours JAVA / Y.Laborde Java : Le LayoutManager GridLayout import java.awt.Button; public class MySixButtonsPanel extends Panel { public MySixButtonsPanel () { this.setLayout (new GridLayout (3,2,4,4)); this.add (new Button ("1")); this.add (new Button ("2")); this.add (new Button ("3")); this.add (new Button ("4")); this.add (new Button ("5")); this.add (new Button ("6")); } EXEMPLE :

28 27 Cours JAVA / Y.Laborde Java : Les gestionnaires de mise en forme Le gestionnaire de mise en forme CardLayout public class java.awt.CardLayout extends Object implements LayoutManager2, Serializable Ce LayoutManager arrange et dimensionne ses composants comme des fiches superposées et de même dimension. Une seule fiche est visible à la fois ; elles sont organisées les unes sur les autres comme une pile de documents. Il n(y a pas donglet de sélection mais le CardLayout définit un ensemble de méthodes permettant soit daccéder séquentiellement aux fiches, soit daccéder à une fiche spécifique. Pour un accès facilité, il est possible dassocier un identifiant de type String à chaque fiche. ObjectCardLayout CONSTRUCTEURS : CardLayout () CardLayout (int hgap, int vgap) METHODES : void addLayoutComponent (String name, Component comp) void addLayoutComponent (Component comp, Object constraints) void first (Container parent)void last (Container parent) void previous (Container parent)void next (Container parent) void show (Container parent, String name)

29 28 Cours JAVA / Y.Laborde Java : Les gestionnaires de mise en forme Le gestionnaire de mise en forme GridBagLayout public class java.awt.GridBagLayout extends Object implements LayoutManager2, Serializable Ce LayoutManager arrange et dimensionne ses composants horizontalement et verticalement comme un GridLayout mais sans quil soit nécessaire quils aient la même taille… Un composant peut donc occuper plusieurs cases de la grille. Il permet des configurations complexes de placement des composants mais sa complexité le rend difficile dutilisation. Il fonctionne en association avec une instance de GridBagConstraints à redéfinir pour chaque composant et qui spécifie comment le composant est doit être placé dans la grille. Lorsque le GridBagLayout arrive en fin de ligne ou quun composant est trop long pour être placé en fin de ligne, les contraintes définies dans le GridBagConstraints précisent comment il doit être traité. Il est également possible dimposer quun composant soit ou non le dernier de la ligne, quil occupe un espace variable en fonction de la place restante, etc. ObjectGridBagLayout CONSTRUCTEURS : GridBagLayout () VARAIBLES de CLASSES et METHODES : (voir la documentation du JDK)

30 29 Cours JAVA / Y.Laborde Ces 3 boutons devront être placés dans un Panel (pN) de type GridLayout La zone de texte et les Panels pN et pE devront être placés dans un Panel (pBL) de type BorderLayout Ces 3 boutons de choix devront être placés dans un Panel (pG) de type GridLayout ; lui-même placé au Nord dun Panel (pE) de type BorderLayout. Java : Les gestionnaires de mise en forme Exercice: écrivez le code permettant de modéliser cet IHM dans une classe MonAppliPanel Panel de lapplicatif de classe MonAppliPanel Bouton 1 Bouton 2 Bouton 3 Zone de texte Check 1 Check 2 Check 3

31 30 Cours JAVA / Y.Laborde Java: Création dune application Java avec Frame (1) import java.awt.*; // La fenêtre Frame applicative class MyFrame extends Frame { static public void main(String[] args) { new MyFrame("Mon application"); } public MyFrame(String titre) { super(titre); this.initIHM(); this.setSize(500, 500); this.setForeground(Color.yellow); this.setFont(new Font("SansSerif", Font.PLAIN | Font.BOLD, 14)); this.addWindowListener (new MyFrameAdapter()); this.setVisible(true); } void initIHM() { // Ici, créer lIHM // dans le panel de la frame... } import java.awt.event.*; // Réception des événements de type Window // pour la fenêtre Frame de l'application class MyFrameAdapter extends WindowAdapter { public void windowClosing (WindowEvent e) { // Termine lapplication (ferme la Frame) System.exit(0); } Classe construisant lapplication en tant que fenêtre Frame Classe capable de recevoir les événements Window qui permettront de fermer la fenêtre Frame Une méthode main() permet de construire la Frame. En général, il nest pas utile de conserver une référence sur lobjet Frame.

32 31 Cours JAVA / Y.Laborde Les classes *Adapter implémentent les interfaces *Listener correspondantes Java : AWT / le package java.awt.event Les trois principaux sous-groupes du package java.awt.event FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter Adaptateurs Toutes ces classes sont Abstract … Object AWTEvent EventObject abstract ActionEvent ItemEvent TextEvent InputMethodEvent ComponentEvent FocusEvent InputEvent … Evénements spécifiques à lAWT PaintEvent WindowtEvent KeyEvent MouseEvent abstract … INTERFACESINTERFACES CLASSESCLASSES ActionListener FocusListener InputMethodListener KeyListener ItemListener Interfaces AWT EventListener MouseListener MouseMotionListener TextListener WindowListener …

33 32 Cours JAVA / Y.Laborde Java : AWT / le package java.awt.event Lorsquun utilisateur interagit avec un composant, la JVM génère puis achemine un événement en correspondance avec le type dinteraction. Exemples, pour un composant de type : - BOUTON, lutilisateur peut lactionner (click sur sa surface puis relâchement) - TEXTE, lutilisateur peut modifier le texte - LISTE, lutilisateur peut sélectionner ou désélectionner un item Mais aussi, pour tous les composants (et conteneurs), de multiples autres événements peuvent être générés, exemples par rapport à : - la SOURIS, déplacement de la souris, bouton appuyé ou relâché, curseur entrant ou sortant du composant - le CLAVIER, touche appuyée ou relâchée, touche tapée - le FOCUS, obtention du focus ou perte du focus Mais, en Java, pour quun événement puisse être généré puis acheminé vers le programme, il faut que le programmeur en ait fait la demande explicite !!! Ce sont les interfaces notées « Interfaces AWT » ainsi que les classes notées « Adaptateurs » qui permettent lACHEMINEMENT des événements (et cest au programmeur de les dériver ou de les implémenter !). Ce sont les classes notées « Evénements spécifiques à lAWT » qui permettent la CONSTRUCTION de tels événements (et cest la JVM qui sen occupe toute seule !).

34 33 Cours JAVA / Y.Laborde Java : AWT / le package java.awt.event Par rapport à la CONSTRUCTION des événements : 1) Tous les événements de lAWT dérivent de deux classes : EventObject est une classe générique qui possède pour méthode principale : - public Object getSource() permettant de récupérer la référence à lobjet doù lévénement provient initialement. Cette référence pourra être castée sur un type plus précis de composant comme un Button. AWTEvent est une classe générique qui possède pour méthode principale : - public String paramString() permettant de récupérer un String représentant létat de lévénement. Cest une méthode normalement destinée au déboggage. 2) Chaque classe dévénement (*Event) possède ses propres méthodes : ActionEvent : - public String getActionCommand() permettant de récupérer un nom décrivant la commande à effectuer. En résumé, il faut retenir la méthode getSource() ainsi que les méthodes propres à chaque classes *Event comme getActionCommand(). public void ??? (ActionEvent e) { if (e.getSource().equals(MonBouton) )... } public void ??? (ActionEvent e) { if (e.getActionCommand().equals(Ma commande) )... }

35 34 Cours JAVA / Y.Laborde Java : AWT / le package java.awt.event Par rapport à lACHEMINEMENT des événements : 1) Les interfaces *Listener définissent les méthodes que le programme recevra pour traiter les événements : ActionListener est une interface qui définit une méthode pour déclencher laction liée à un BOUTON : - public void actionPerformed(ActionEvent e) est la méthode qui sera invoquée par la JVM à chaque fois quun utilisateur déclenchera laction relative à un bouton. ItemListener est une interface qui définit une méthode liée à la sélection dun ITEM de LISTE : - public void itemStateChanged(ItemEvent e) est la méthode qui sera invoquée par la JVM à chaque fois quun utilisateur sélectionnera ou désélectionnera un item dune liste. WindowListener est une interface qui définit SEPT méthodes liées à des événements concernant des fenêtres : public void windowOpened(WindowEvent e) public void windowClosing(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) 2) Les classes *Adapter fournissent un moyen pour simplifier la création de classes qui doivent implémenter des *Listener (contenant de nombreuses méthodes) : WindowAdapter est une classe qui implémente linterface WindowListener et qui fournit les 7 méthodes de cette interface avec un corps vide ! Elle pourra être dérivée puis il suffira de donner un corps à la ou les méthodes utiles ; les autres pourront rester vides (VOIR TRANSPARENT #30). En résumé, il faut retenir les méthodes des principaux *Listener comme actionPerformed(). public void actionPerformed(ActionEvent e) { if (e.getSource().equals(MonBouton) ) //... Écrire ici le code correspondant à laction sur le bouton MonBouton }

36 35 Cours JAVA / Y.Laborde Java : AWT / liens entre applicatif et composants actifs Si les événements (*Event) sont automatiquement générés par la JVM, ils ne seront transmis à lapplicatif que lorsquils auront été LIES à des méthodes spécifiques. Ces méthodes sont celles définies dans les *Listener ou les *Adapter. La manière de définir un Listener est commune à tous les composants mais il nest pas permis de définir nimporte quel Listener pour nimporte quel composant (par ex: un ItemListener ne peut être associé à un bouton mais une liste peut accepter aussi bien un ActionListener quun ItemListener). En résumé, pour lier un listener à un composant, il faut invoquer une méthode appartenant au composant et dont le type général est : public void add*Listener (*Listener l) où létoile (*) doit être remplacée par le nom spécifique du type dévénement concernant le composant, comme par exemple Action, Item ou Window. La liaison à définir consiste à rendre un composant actif en lui associant un objet « écouteur dévénement » (doù lappellation « Listener »). Rq: lautre appellation, « Adapter », est similaire à celle de « Listener » puisque les *Adapter sont des sortes de *Listener de part leur relation dimplémentation. Les *Adapter sont des classes prêtes à être dérivées et pouvant être observées uniquement au travers de leur nature de *Listener.

37 36 Cours JAVA / Y.Laborde Java : AWT / liens applicatif/composants actifs (exemple 1) import java.awt.*; import java.awt.event.*; // La fenêtre Frame applicative class MyFrame extends Frame implements ActionListener { Button[2] mesBoutons; public MyFrame(String titre) {... this.addWindowListener(new MyFrameAdapter()); this.setVisible(true); } void initIHM() { mesBoutons[0] = new Button(Annuler); mesBoutons[0].addActionListener(this); this.add(mesBoutons[0]); mesBoutons[1] = new Button(OK); mesBoutons[1].addActionListener(this); this.add(mesBoutons[1]); } public void actionPerformed(ActionEvent e) { if (e.getSource().equals(mesBoutons[0]) ) // Écrire laction du bouton Annuler else if (e.getSource().equals(mesBoutons[1]) ) // Écrire laction du bouton OK } } Classe construisant la Frame applicative avec 2 boutons « Annuler » et « OK » et servant également de LISTENER pour les 2 boutons. Lévénement correspondant aux demandes dactions des boutons est reçu dans la même méthode (actionPerformed( … )). Le code commence donc par sinformer de quelle bouton provient la demande daction. un LISTENER import java.awt.event.*; // Réception des événements de type Window // pour la fenêtre Frame de l'application class MyFrameAdapter extends WindowAdapter { public void windowClosing (WindowEvent e) { // Termine lapplication (ferme la Frame) System.exit(0); } Classe définie comme LISTENER des événements Window de la Frame. Elle étend WindowAdapter, elle-même implémentant WindowListener. Cette classe redéfinit seulement la méthode windowClosing( … ) car les autres ne lintéressent pas.

38 37 Cours JAVA / Y.Laborde Java : AWT / liens applicatif/composants actifs (exemple 2) import java.awt.*; import java.awt.event.*; // La fenêtre Frame applicative class MyFrame extends Frame implements ActionListener { public MyFrame(String titre) {... this.setVisible(true); } void initIHM() { Button b = new Button(Annuler); b.setActionCommand(ANN); b.addActionListener(this); this.add(b); b = new Button(OK); b.setActionCommand(OK); b.addActionListener(this); this.add(b); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(ANN) ) // Écrire laction du bouton Annuler else if (e.getActionCommand().equals(OK)) // Écrire laction du bouton OK } } Ici, on a utilisé le couple : void.setActionCommand(…) et String.getActionCommand() plutôt que : Object.getSource() Cela a permis de ne pas conserver les références sur les objets Button. Rq: un même bouton pourrait alors faire varier son action en modifiant son actionCommand. Cela peut être utile dans les cas où laction dun bouton dépend dactions antérieures par exemple.

39 38 Cours JAVA / Y.Laborde Java : AWT / liens applicatif/composants actifs (exemple 3) import java.awt.*; // La fenêtre Frame applicative class MyFrame extends Frame { public MyFrame(String titre) {... this.setVisible(true); } void initIHM() { ActionListener actLst = new MyButtonsAdapter(); Button b = new Button(Annuler); b.setActionCommand(ANN); b.addActionListener(actLst); this.add(b); b = new Button(OK); b.setActionCommand(OK); b.addActionListener(actLst); this.add(b); } import java.awt.event.*; // Une classe Adapter à part pour les 2 boutons class MyButtonsAdapter implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(ANN) ) // Écrire laction du bouton Annuler else if (e.getActionCommand().equals(OK)) // Écrire laction du bouton OK } Avec le couple : void.setActionCommand(…) et String.getActionCommand() Cela est utile lorsque lon désire que le LISTENER des boutons soit une classe à part. Celui-ci na alors pas à connaître les références sur les boutons dont il gère les actions.

40 39 Cours JAVA / Y.Laborde Java : AWT / liens applicatif/composants actifs (exemple 4) import java.awt.*; // La fenêtre Frame applicative class MyFrame extends Frame { public MyFrame(String titre) {... this.setVisible(true); } void initIHM() { Button b; b = new MyButton(Annuler,ANN); this.add(b); b = new MyButton(OK,OK); this.add(b); } import java.awt.Button; import java.awt.event.*; // La classe Button est dérivée pour être son propre Adapter class MyButton extends Button implements ActionListener { public MyButton(String caption, String actCom) { super(caption); this.setActionCommand(actCom); this.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(ANN) ) // Écrire laction du bouton Annuler else if (e.getActionCommand().equals(OK)) // Écrire laction du bouton OK } Avec le couple : void.setActionCommand(…) et String.getActionCommand() En dérivant la classe Button, on peut également en faire un LISTENER commun à tous les boutons. Celui-ci na alors pas à connaître les références sur les boutons dont il gère les actions.

41 40 Cours JAVA / Y.Laborde Java : AWT / Une calculatrice Exercice: écrivez le code permettant de modéliser une calculatrice simple. Vous réaliserez lIHM sans menu et en groupant les LISTENER des boutons par catégories : groupe des boutons numériques ( 0 à 9, +/-,. ) groupe des boutons de mémoires ( MC, MR, MS, M+ ) groupe des boutons dopérations binaires ( /, *, -, + ) groupe des boutons dopérations unaires ( Rac, %, 1/x, = ) groupe des boutons de commandes ( Retour arrière, CE, C )


Télécharger ppt "1 Cours JAVA / Y.Laborde Java : Interface Homme-Machine LES CONCEPTS de LIHM : Introduction LAWT (Abstract Window Toolkit) le package java.awt les composants."

Présentations similaires


Annonces Google