Ou comment réaliser une interface graphique en utilisant les classes swing... Nous développerons ici les notions générales du graphisme en Java.
Tous les objets java que nous allons utiliser proviennent du package : javax.swing. Fourni à partir du JDK 1.2, le package javax.swing est beaucoup plus riche que le package graphique basique AWT, sur lequel il se base. Ces deux packages ont beaucoup d'objets en commun mais javax.swing complète avantageusement java.awt .
Il faut tout d'abord importer les classes du package javax.swing. Ce package contient tous les objets de base pour créer une interface utilisateur conviviale: barre de défilement, boutons, boutons radio, saisie de texte, etc ...Les noms des classes Swing sont précédés d'un "J", ce qui les différencie de celles du package AWT :
La classe Button en AWT devient la classe JButton pour l'objet Swing
La classe TextField en AWT devient la classe JTextField pour l'objet Swing.
etc...
En revanche on utilise encore l'AWT pour gèrer la plupart des événements et des mises en page ( Layout ).
Les objets les plus couramment utilisés avec Swing sont les classes :
Classe |
Description |
JFrame |
Fenêtre graphique. |
JPanel |
Zone graphique, container |
JButton |
Objet bouton |
JTextField |
Zone de texte à saisir |
JLabel |
Texte non modifiable |
JComboBox |
Choix d'éléments dans une liste avec sélecteur |
JScrollBar |
Barre de défilement |
JTable |
Tableau |
JList |
Choix d'éléments dans une liste sans sélecteur |
JCheckBox |
Objet pouvant être coché ou décoché |
JRadioButton |
Choix exclusifs pour les options |
La base d'une interface développée en Java est le panneau ( classe Panel ). Un panneau est un objet pouvant contenir les composants graphiques à afficher. Un panneau peut contenir d'autres panneaux. Il faut imaginer ce panneau comme une base de construction sur laquelle on peut poser d'autres éléments pour former une interface graphique. Pour comprendre la logique des éléments graphiques, il faut savoir que tous les éléments appartiennent à la classe Component.
Classes graphiques de Java
Tous les objets graphiques Java sont des composants de la classe
Component . Les objets swing sont des JComponent,
classe fille de Component. Ces objets sont susceptibles d'être
associés à des événements ( vus plus loin
) tels une sélection dans une liste déroulante ou un
clic. Ils possèdent des méthodes de type
addItemListener() qui les rendent sensibles aux événements.
Les objets graphiques sont également appelés widgets.
Un container ( classe Container )
est un composant possédant la faculté de contenir
d'autres composants. Par exemple, un bouton ( JButton ) est un
container car il peut contenir un titre ( JLabel ).
Une fenêtre ( classe JFrame ) est une fenêtre système autonome. Il est ainsi possible de développer facilement des applications multi-fenêtrées. La frame est un container qui possède un panneau racine dont la référence est donnée par la méthode getContentPane(). Un ajout de composants ou de containers dans ce dernier panneau permet de les afficher à l'écran. Attention! une JFrame ne peut contenir directement de composants graphiques, il faut utiliser son panneau racine.
Une applet au sens général est une petite
application s'exécutant à l'intérieur d'une
autre application ( en général un navigateur web ).
Dans le sens strict, un objet JApplet est un container pouvant
contenir d'autres composants graphiques. Tout comme la JFrame,
elle possède un panneau racine dont la référence
est donnée par la méthode getContentPane(). Les
composants graphiques sont alors posés sur ce panneau et
s'affiche dans l'applet.
Chaque container spécifie sa méthode de mise en page. C'est la façon dont sont positionnés les objets les uns par rapport aux autres. Les objets gérant cette mise en page sont des layouts. Un panel peut contenir d'autres panels dont chacun possède un layout diffèrent. Les gestionnaires de placement les plus courants sont les suivants :
Il permet une mise en place séquentielle des composants. Par défaut ils s'affichent de la gauche vers la droite. Lorsqu'il n'y a plus de place sur une ligne, les objets sont affichés sur la ligne d'en dessous.
Le layout est créé en spécifiant le nombre de lignes et de colonnes et chaque composant graphique est affiché dans une cellule du tableau. Toutes les cellule font la même taille ( donc celle du plus grand élément ) .
Le BoxLayout définit un 'empilage' des objets sur l'axe des X ou des Y. Il ressemble au FlowLayout mais il est plus complet car possède des attributs qui permettent un affichage plus facile et affiné.
Si on ne fixe pas de LayoutManager à notre panel, le premier élément posé dans ce dernier prend l'intégralité de l'espace disponible et masque les widgets ultérieurs. Dans ce cas, il est possible de placer les objets au pixel près par la méthode setBounds(int X,int Y,int width,int height) de la classe Component. Mais dans ce cas, il faut s'assurer que l'on n'utilise pas de layout et faire un setLayout(null).
Un événement est un objet de type Event. Les événements sont générés lors d'une action de l'utilisateur sur l'interface. Par exemple, le clic sur un bouton peut générer un événement de type MouseEvent. Mais ces événements n'ont de conséquences sur le programme que si l'objet possède un écouteur ( listener ) à l'écoute. Dans l'exemple du bouton, si on clique sur ce dernier, le gestionnaire graphique Java génère un objet MouseEvent qui va être intercepté par un écouteur préalablement posé ( comme un MouseListener ). Alors le programme exécutera la méthode de traitement associée à l'écouteur, dans notre cas, le programme exécutera la méthode mouseClicked(MouseEvent me). Notez que les objets événement sont toujours générés dans une application graphique mais dans le cas où il n'y a pas d'écouteurs pour les intercepter, il n'y aura pas de traitements associés. Les écouteurs et événements courants font partie du package AWT. Il faut donc penser à faire un import du package java.awt.event. Les composants graphiques possèdent des méthodes spécifiques permettant de poser un écouteur. Par exemple, addActionListener(ActionListener al) permet de poser un écouteur de type 'action sur le composant' qui sait intercepter les ActionEvent comme le clic sur une liste défilante. Il existe des écouteurs pour chaque type d'événement. Les écouteurs sont toujours des interfaces. Ainsi la classe de développement courante devra implémenter toutes les méthodes de l'interface. La plupart du temps, il n'y en a qu'une. C'est cette méthode que le programme exécutera si l'événement se produit. Remarquons que si la classe courante implémente un ActionListener, elle devient elle-même un objet de type ActionListener. Par conséquent,les méthodes d'ajout d'écouteurs sur des composants graphiques comme addActionListener(ActionListener al) qui prennent en argument un ActionListener pourront prendre this en argument.
Listeners courants |
Méthodes à implémenter |
MouseListener |
MouseClicked(MouseEvent e) |
|
MouseEntered(MouseEvent e) |
|
MouseExited(MouseEvent e) |
|
MousePressed(MouseEvent e) |
|
MouseReleased(MouseEvent e) |
|
MouseDragged(MouseEvent e) |
ActionListener ( exemple: les boutons ) |
|
|
ActionPerformed(ActionEvent e) |
ItemListener ( exemple: les listes comme les ComboBox ) |
|
|
ItemStateChanged(ItemEvent e) |
FocusListener |
|
|
FocusGained(FocusEvent e) |
|
FocusLost(FocusEvent e) |
Il existe également des écouteurs pour gérer les actions sur une fenêtre ( WindowListener ), gérer la barre de défilement ( AdjustementListener ), etc...
Créer une interface graphique ( une fenêtre ) d'une taille de 320 pixels par 200 pixels qui porte le nom "TEST". Cette interface doit contenir :
Un Titre "TEST GUI"
Un Bouton avec comme label "Au revoir"
Ajouter ses objets sur le panel principal, quel résultat voyez-vous ? Où est le problème ?
Mise en place d'une mise en page de haut en bas sur cette même interface. Choisissez votre mise en page de manière à optimiser le placement.
Le titre doit être centré au-dessus du bouton et les deux objets ne doivent pas être "collés".
Pensez à utiliser plusieurs panels.
Ajouter un listener sur le bouton pour que l'application se ferme lors du clic sur le bouton.
Ajouter une JComboBox initialisées avec trois éléments. Lorsqu'on choisi un élément dans la ComboBox, la valeur est affichées dans un JLabel.