L'interface Graphique Java
GUI (Graphic User Interface)
    Youssef BERAICH
    ENS – Tétouan
    2010/2011
                               1
Généralités
 Une interface graphique est un ensemble de
  composants graphiques permettant à un
  utilisateur de communiquer avec un logiciel.
 Les éléments graphiques de l'interface java
  sont définis dans le paquetage AWT (Abstract
  Window Toolkit).
 AWT est une librairie de classes graphiques
  s'exécutant sans recompilation sur tout
  ordinateur disposant d'un interpréteur JVM.
 L'apparence diffère selon système
  d'exploitation, mais il existe une autre
  librairie appelée Swing autonome qui ne
  dépend pas du SE.
                                           2
Les éléments de AWT
 AWT comporte :
   des composants (Component) parmi
    lesquels on distingue deux types :
    Les conteneurs : Containers
    Les widgets
   des gestionnaires de mise en page
    (LayoutManager)
   Un mécanisme de gestion d'événements
                                           3
La classe Component (Composant graphique)
 Les composants se répartissent en trois
  catégories :
   Les composants prédéfinis.
   Les composants personnalisés dérivés de la classe
    Canvas.
   Les containers utilisés pour contenir
    d'autres composants .
                                                        4
hiérarchie des classes dérivées de Component
hiérarchie des classes dérivées de Component
   java.awt.Component
       java.awt.Button
       java.awt.Canvas
       java.awt.Checkbox
       java.awt.Choice
       java.awt.Container
           java.awt.Panel
                          Applet
                java.applet.
         java.awt.Window
               java.awt.Dialog
                    java.awt.FileDialog
               java.awt.Frame
       java.awt.Label
       java.awt.List
       java.awt.Scrollbar
       java.awt.TextComponent
         java.awt.TextArea
         java.awt.TextField
                                           6
Les composants prédéfinis
        Les boutons (de classe Button) : un programme
        déclenche une action quand l'utilisateur clique sur
        un bouton.
        Les boites à cocher (de classe Checkbox) : ce
        sont des composants ayant deux états possibles
        (coché ou non coché),
        Les boutons radios (de classe Checkbox associés
        à un ensemble de classe CheckboxGroup). A un
        moment donné, un seul bouton radio ne peut être
        choisi parmi ceux de l'ensemble auquel il
        appartient.
                                                       7
Les composants prédéfinis
        Les composants de classe Choice (appelés aussi
        Combo box ou Drop down list dans d'autres
        environnements) : Ce type de composant propose
        à l'utilisateur de faire un choix parmi un certains
        nombres de chaînes de caractères affichées dans
        une liste déroulante.
        Les listes (de classe List) : ce sont des
        composants qui permettent par simple clic, de
        sélectionner ou de désélectionner une ou plusieurs
        chaînes de caractères affichées dans une
        Les labels (de classe Label) : Ce sont les
        composants les plus simples ; un label permet
        d'afficher une chaîne de caractères (titre,
        message, information décrivant un composant
        juxtaposé,...).
                                                        8
Les composants prédéfinis
         Les zones de saisies de texte (composant avec
         une seule ligne TextField ou avec plusieurs
         lignes TextArea) : Ces composants permettent
         à l'utilisateur de saisir une chaîne de caractères.
         Les ascenseurs (de classe Scrollbar) : utilisés
         en association avec un autre composant (en
         général un container), quand la zone d'affichage
         de celui-ci est trop petite pour contenir tout ce
         qu'il peut afficher.
                                                         9
Les Canvas
 Les composants dérivés de la classe
  Canvas :
  Si les composants prédéfinis ne satisfont
   pas un de vos besoins, vous devez
   utiliser cette classe comme super classe
   pour créer vos propres composants que
   vous dessinez en utilisant les méthodes
   de la classe Graphics.
                                        10
Les Containers
 Contrairement aux autres composants, les
  containers sont utilisés pour contenir
  d'autres composants de n'importe quelle
  catégorie ou pour afficher directement des
  dessins fabriqués avec les méthodes de la
  classe Graphics.
 Les containers se subdivisent en deux sous
  catégories qui héritent toutes deux de la
  classe abstract Container :
   containers de type fenêtre Window
   Les containers de classe Panel
                                          11
containers de type fenêtre
 Les containers de type fenêtre (de classe
  Window ou ses dérivées)
 Les fenêtres sont des zones d'affichage
  indépendantes les unes des autres.
 Parmi les fenêtres, on distingue:
   les boites de dialogue (de classe Dialog)
    comportant un cadre et un titre
   les fenêtres de classe Frame comportant un
    cadre, un titre, un menu éventuel, un pointeur
    de souris propre,... (et correspondant aux
    fenêtres que vous avez l'habitude d'utiliser).
                                              12
Les containers de classe Panel
 Les containers de classe Panel :
 Ce type de containers est une zone
  d'affichage occupant tout ou partie d'une
  fenêtre.
 Notamment, la classe Applet dérive de
  Panel et permet d'afficher des
  composants ou un dessin dans une
  fenêtre d'un navigateur.
                                         13
Gestionnaires de placement (LayoutManager)
 Ils ont en charge le positionnement des
  différents composants dans un container.
 En effet, définir la position exacte de chaque
  composant dans un conteneur, et ce en
  fonction de la taille de la fenêtre qui peut à
  tout instant être modifiée par l’utilisateur,
  peut s’avérer rapidement ingérable dès lors
  que le nombre de composants commence à
  devenir quelque peu important. De plus, plus
  le code est long, plus la maintenance est
  rendue difficile, et ce même dans le cas
  d’une modification mineure.
Gestionnaires de placement (LayoutManager)
 Le point repérant le coin supérieur gauche
  (CSG) et la dimension du rectangle
  occupé peuvent être indiqués ou
  calculés par le programme pour chacun
  des composants.
 Les composants peuvent être disposés
  automatiquement en suivant les
  caractéristiques définies dans un objet
  chargé de la mise en page (Layout). Ceci
  est utile lorsque la fenêtre change de
  taille.
                                         15
LayoutManager
 Plusieurs types de mise en page sont
  prédéfinis:
  Absence de Layout (null).
  FlowLayout.
  BorderLayout.
  GridLayout.
  CardLayout.
  GridBagLayout.
                                         16
Absence de Layout
 Les composants sont rangé en fonction de leur
  position et dimension définies explicitement
  dans le programme:
     setLocation(), setSize() et setBounds()
 en cas de redimensionnement de la fenêtre les
  composants ne sont pas déplacés.
                                                17
FlowLayout
 Ce gestionnaire
  dispose les
  composants les uns à
  la suite des autres,
  sur une même ligne.
 Lorsqu’une ligne ne
  possède plus                               three
  suffisamment de           one
                                    two
  place, l’affichage se
  poursuit sur la ligne
  suivante.
 On peut imposer une
                             four
  taille à un composant               five
  en utilisant la
  méthode
  setPreferredSize. À
  qui on fournit un objet
  de type Dimension.
                                                18
FlowLayout
 Lors de la construction d ’un gestionnaire
  FlowLayout, on peut spécifier un
  paramètre d’alignement d’une ligne de
  composants par rapport aux bords
  verticaux de la fenêtre. Pour cela, on
  utilise l’une des constantes entières
  suivantes :
   FlowLayout.LEFT
   FlowLayout.RIGHT
   FlowLayout.CENTER
                                         19
Le gestionnaire FlowLayout : affichage
                                         20
BorderLayout
 L’emplacement est choisi lors de l’appel de
  la méthode add en utilisant une des
  constantes symboliques suivantes:
   BorderLayout.NORTH
   BorderLayout.SOUTH
   BorderLayout.EAST
   BorderLayout.WEST
   BorderLayout.CENTER
 Le gestionnaire par défaut est le
  gestionnaire Borderlayout.
 La taille des composants n’est pas
  respectée.
                                            21
Le gestionnaire BorderLayout : Affichage
                                           22
GridLayout
 Ce gestionnaire
  permet de
  disposer les
  différents           one    two    three
  composants
  suivant une grille
                       four
  régulière, chaque           five   six
  composant
  occupant une
  cellule.
                                           23
Le gestionnaire GridLayout : Affichage
                                         24
CardLayout
 Les composants sont présentés un par un
  comme un paquet de cartes vu de
  dessus. On ne voit que le composant du
  dessous.
 Des méthodes permettent de basculer
  entre les différents composants.
                                      25
GridBagLayout
 Les composants sont rangés dans des
  cases de même taille disposées en lignes
  et en colonnes mais en tenant compte
  des contraintes: tel composant doit être
  le dernier de sa ligne par exemple; tel
  autre composant occupe deux cases, etc.
                                       26
 Gestion des événements
 Les événements sont classés par thèmes donnant lieu
  chacun à une classe. Voici quelques unes de ces classes :
  composant      générateur              signification
 ActionEvent       Button      clic, TextField : touche Entrée
 MouseEvent      Component     mouvements et clic de souris
                               enfoncement et relâchement de
  KeyEvent       Component
                               touche
                               entrée et sortie du curseur de
 FocusEvent      Component
                               souris
                  TextField,
  TextEvent                    modification du texte
                  TextArea
                               iconification, activation,
WindowEvent       Window
                               ouverture, fermeture
Gestion des événements : Hierarchie
Gestion des événements : Principe
 Les composants Swing créent des événements,
  soit directement, soit par une action de
  l'utilisateur sur le composant. Ces événements
  peuvent déclencher une action exécutée par
  d'autre(s) composant(s).
   Un composant qui crée des événements est appelé
    source. Le composant source délègue le traitement
    de l'événement au composant auditeur.
   Un composant qui traite un événement est appelé
    auditeur (listener)
 Un composant auditeur doit s'inscrire auprès du
  composant source des événements qu'il veut
  traiter.
               L'événement                        L'interface Listener
                                               interface XxxListener{
class XxxEvent extends java.util.EventObject
                                                    void traiter( XxxEvent
{ public Xxx(Object source){ super(source);}
                                                    e);
       ...}
                                               }
ActionEvent
 interface ActionListener{
  void actionPerformed(ActionEvent e);
  }
 Les composants sources de ActionEvent
  sont :
   Boutons : JButton, JRadioButton, JCheckBox,
    JToggleButton
   Menus : JMenuItem, JMenu,
    JRadioButtonMenuItem, JCheckBoxMenuItem
   Texte : JTextField
 ActionEvent
Object getSource()          Retourne l'objet source de l'événement.
int getID()                 Retourne le type d'événement.
                            Retourne le texte associé au composant
String getActionCommand()       source de l'événement (bouton ou
                                menu)
                            Retourne un entier indiquant si les
                                touches maj, alt ou ctrl étaient
int getModifiers
                                appuyées au moment de la
                                génération de l'événement.
                            Retourne la date et l'heure de la
long getWhen()
                                génération de l'événement.
                            Retourne une chaîne de caractères
String paramString()            contenant toutes les informations
                                précédentes.
MouseEvent
 Tous les composants peuvent être sources de
  MouseEvent . Lors d'un clic les méthodes sont
  appelées dans l'ordre suivant :
   mousePressed
   mouseReleased
   mouseClicked
 interface MouseListener{
  void mouseClicked(MouseEvent e);
  void mouseEntered(MouseEvent e);
  void mouseExited(MouseEvent e);
  void mousePressed(MouseEvent e);
  void mouseReleased(MouseEvent e);
  }
 MouseEvent
Object getSource()    Retourne l'objet source de l'événement.
int getID()           Retourne le type d'événement.
                      Retourne les coordonnées de la souris lors de la génération de
Point getPoint()          l'événement.
                      Retourne la coordonnée en X de la souris lors de la génération de
int getX()                l'événement.
                      Retourne la coordonnée en Y de la souris lors de la génération de
int getY()                l'événement.
                      Retourne un entier indiquant si les touches maj, alt ou ctrl étaient
int getModifiers          appuyées au moment de la génération de l'événement.
long getWhen()        Retourne la date et l'heure de la génération de l'événement.
                      Retourne quel bouton a été cliqué. les trois valeurs possibles
int getButton())          sont : MouseEvent.BUTTON1,
                          MouseEvent.BUTTON2, MouseEvent.BUTTON3
int getClickCount()   Retourne le nombre de clics associés à cet événement.
KeyEvent
 Les événements sont générés dans l'ordre :
   keyPressed
   keyTyped : pour les touches qui ont un effet sur le
    texte d'un composant texte.
   keyReleased
 interface MouseListener{
  void keyTyped(KeyEvent e);
  void keyPressed(KeyEvent e);
  void KeyReleased(KeyEvent e);
  }
 Tous les composants peuvent être sources de
  KeyEvent
 KeyEvent
>Object getSource()                Retourne l'objet source de l'événement.
int getID()                        Retourne le type d'événement.
                                   Retourne le caractère correspondant à la touche du
                                       clavier, ou
char getKeyChar()                      java.awt.event.KeyEvent.CHAR_UNDEFINED
                                       s'il n'y a pas de caractère associé à la touche
                                       (touche de fonction par exemple).
                                   Retourne le code du caractère correspondant à la
int getKeyCode()
                                       touche du clavier.
                                   Retourne un entier indiquant si les touches maj, alt ou
int getModifiers                       ctrl étaient appuyées au moment de la
                                       génération de l'événement.
                                   Retourne la date et l'heure de la génération de
long getWhen()
                                       l'événement.
                                   Retourne le modifieur sous forme de chaîne de
String getKeyModifiersText(int >
                                       caractères : Maj+Crtl+Alt.
     mod)
Adaptateur
 Un adaptateur XxxAdapter est une classe
  abstraite qui fourni une implémentation de la
  classe XxxListener. Les méthodes implémentées
  sont toutes vides, et ainsi permettent à un
  utilisateur de l'adaptateur de ne redéfinir que le
  traitement qui l'intéresse.
Adaptateur
 Exemple : Un adaptateur qui ne redéfinit
  que KeyPressed et keyTyped :
composantSource.addKeyListener(new
   java.awt.event.KeyAdapter(){
public void keyPressed(
   java.awt.event.KeyEvent e){
       ...
}
public void keyTyped(
        java.awt.event.KeyEvent e){ . . .   }
});