Swing 1
Swing 1
Swing 1
VERSION NO 2
5 Janvier 2003
RAJOUTS À LA VERSION NO 1
Chapitre «Gestion des événements»
Contenu
1 COMPOSANTS GRAPHIQUES 1
1.1 CONCEPTION D'UNE INTERFACE UTILISATEUR 1
Qu'est-ce qu'un composant graphique ? 1
Les conteneurs 2
JFrame 2
JPanel 2
JApplet 2
Connaître la taille utile d’une fenêtre 3
1.2 LES COMPOSANTS DE LA LIBRAIRIE SWING 3
JCheckbox (boîte à cocher) 5
Pour créer un JCheckBox, les constructeurs 7
Evénements spécifiques 7
Autres méthodes intéressantes (héritées de AbstractButton) 7
JButton 8
Possibilité d’insérer une image dans un bouton (Icon) 8
Pour créer un JButton, les constructeurs 9
Evénements spécifiques 9
Autres méthodes intéressantes (héritées de AbstractButton) 9
JComboBox (menu déroulant) 9
Pour créer un JComboBox, les constructeurs 10
Pour ajouter des éléments dans la liste de choix 10
Evénements spécifiques 11
Autres méthodes intéressantes 11
JLabel 11
JTextComponents 12
JTextField & JTextArea 13
JToolTip 13
Exemple 14
JToolBar 14
2 GESTIONNAIRES DE DISPOSITION 18
2.1 EN PRÉLIMINAIRE 18
2.2 A PROPOS DES GESTIONNAIRES DE DISPOSITION 18
Le gestionnaire par défaut des conteneurs 19
Choisir un autre gestionnaire pour un conteneur 19
Swing - ii -
1 Composants graphiques
Vous définissez ensuite les valeurs des propriétés des composants et vous attachez le
code des gestionnaires aux événements des composants, pour indiquer au programme
comment répondre aux événements de l'interface utilisateur.
Chaque composant, encapsule certains éléments d'un programme, tels une fenêtre ou
une boîte de dialogue, un champ d'une base de données, un timer système. Les compo-
sants d'interface utilisateur doivent étendre la classe java.awt.Component ou
toute autre classe dérivée d'elle, comme javax.swing.JPanel ou encore
javax.swing.JFrame.
JFrame
Une fenêtre de haut niveau, avec une bordure et un titre. Un JFrame (cadre) possède les
contrôles de fenêtre standard, tels un menu système, des boutons pour réduire ou agran-
dir la fenêtre et des contrôles et la redimensionner. Il peut aussi contenir une barre de
menus.
JPanel
Panneau graphique, jouant principalement le rôle de conteneur. Les JPanel peuvent
s’imbriquer les uns dans les autres sans limite aucune.C’est la brique de base qui permet
au programmeur de mettre en place les interfaces graphiques les plus compliqués qui
soient.
Un JPanel peut également jouer le rôle de surface graphique dans laquelle le pro-
grammeur peut dessiner ou afficher des images. Il suffit pour cela de redéfinir la
méthode paintComponent(Graphics).
JApplet
Une sous-classe de la classe java.awt.Panel utilisée pour construire un programme
devant être incorporé dans une page HTML et exécuté dans un navigateur HTML ou
dans un visualiseur d'applet. JApplet étant une sous-classe de Panel, elle peut conte-
nir des composants, mais elle ne possède ni bordure, ni titre.
Cette méthode retourne un objet de type Insets, caractérisé par 4 attributs publics:
top, bottom, left et right, qui indique la taille occupée de manière générale par
la bordure du conteneur. Par exemple, l’attribut top d’un JFrame caractérise la hau-
teur en pixels occupée par la barre de titre.
Il est possible de spécifier les deux icônes qui seront utilisées pour afficher les états
«on» et «off».
.
public CheckboxPanel() {
Evénements spécifiques
void addActionListener(ActionListener l)
Pour inscrire un écouteur d’événement ActionEvent auprès de la boîte à
cocher. L’écouteur recevra le message actionPerformed(ActionEvent) à
chaque fois que l’état de la boîte à cocher aura été modifié.
void removeActionListener(ActionListener l)
Pour désinscrire un écouteur d’événement
1.2.2 JButton
Un bouton est un composant graphique, susceptible d’être «cliqué» par l’utilisateur, et
qui répondra à cet événement en envoyant le message actionPerformed(..) à tous
les objets qui se seront inscrits auprès de lui en tant qu’écouteur.
Evénements spécifiques
void addActionListener(ActionListener l)
Pour inscrire un écouteur d’événement ActionEvent auprès d’un bouton.
L’écouteur recevra le message actionPerformed(ActionEvent) à chaque
fois que le bouton aura été cliqué.
void removeActionListener(ActionListener l)
Pour désinscrire un écouteur d’événement
Si l’utilisateur presse une touche correspondant à la première lettre de l’un des choix
possibles, le composant le sélectionne automatiquement.
public JComboBox()
Pour créer un ComboBox, avec une liste de choix vide
Evénements spécifiques
void removeActionListener(ActionListener l)
Pour désinscrire un écouteur d’événement
int getSelectedIndex()
Pour retourner l’indice de l’élément sélectionné
Object getSelectedItem()
Pour retourner l’élément sélectionné
void setSelectedItem(Object anItem)
Pour pré-sélectionner un élément
1.2.4 JLabel
Un JLabel affiche du texte, ou une une image, sur une simple ligne en lecture unique-
ment.
Possibilités:
1.2.5 JTextComponents
JTextComponent est une classe générique qui contient toutes les caractéristiques qui
pourraient être utiles à la création d’un petit éditeur simplifié.
cut()
paste()
getSelectedText()
setSelectionStart()
setSelectionEnd()
selectAll()
replaceSelection()
getText()
setText()
setEditable()
setCaretPosition()
add(tf);
add(new JScrollPane(ta));// Avec une barre de défilement
1.2.6 JToolTip
Un «tooltip» est un texte fugitif, dépendant du contexte, qui s’affiche dans une petite fe-
nêtre quand la souris s’attarde sur un objet spécifique de l’écran. La classe JToolTip
elle-même sera rarement utilisée directement. Il suffit en effet d’utiliser la méthode
setToolTipText()héritée de la classe JComponent.
Exemple
1.2.7 JToolBar
Le composant JToolBar est une espèce de conteneur qui affiche ses composants à la
manière d’une barre d’outils, verticalement ou horizontalement, en s’adaptant à la sur-
face de l’écran dans laquelle il se trouve placé.
Une barre d’outils peut être flottante: l’utilisateur pouvant la déplacer et la placer où
bon lui semble en draguant la barre d’outils dans une autre région de l’écran, ou même
en déplaçant cette dernière dans une fenêtre externe au conteneur d’origine.
JToolBar()
JToolBar(int)
Le paramètre permet de spécifier l’orientation de la barre d’outils: HORIZON-
TAL ou VERTICAL, ces deux constantes étant définies dans l’interface
javax.swing.SwingConstants.
JToolBar(String)
Le paramètre permet de spécifier un titre, qui apparaîtra lorsque la barre
d’outils aura quitté son port d’attache.
JToolBar(String, int)
Les deux paramètres sont expliqués dans les lignes qui précèdent
Un espace vide peut être rajouter entre les composants au moyen de la méthode add-
Separator():
unToolBar.addSeparator();
Un exemple
Voici un petit exemple présentant un JPanel dans lequel deux barres d’outil ont été
placées, la première au nord, et la deuxième au sud. L’effet obtenu serait bien entendu
plus esthétique si les composants placés dans les barre d’outils étaient de type et de taille
identiques.
2 Gestionnaires de
disposition
2.1 EN PRÉLIMINAIRE
Un programme écrit en Java peut être déployé sur plusieurs plates-formes. Si vous uti-
lisiez des techniques standard de conception d'interface utilisateur en spécifiant la posi-
tion et la taille de vos composants en valeur absolue, votre interface n'apparaîtrait pas
correctement sur toutes les plates-formes. Ce qui paraît bon avec le système sur lequel
vous développez peut s'avérer inutilisable sur une autre plate-forme. Pour résoudre ce
problème, Java fournit un système portable de gestionnaires de disposition. Utilisez ces
gestionnaires de disposition pour spécifier les règles et les contraintes de disposition au
sein de votre interface utilisateur, de sorte que cette dernière puisse être portée sur une
autre machine.
1. Des composants correctement positionnés, car indépendants des polices, des ré-
solutions d'écrans et des différences de plates-formes.
2. Un positionnement intelligent des conteneurs, qui sont redimensionnés à l'exé-
cution de façon dynamique.
3. La traduction des chaînes facilitée. Si une chaîne s'agrandit, les composants res-
tent correctement alignés.
La taille du conteneur.
Tous les panneaux, - c’est-à-dire les «JPanel» -, (y compris les applets) utili-
sent par défaut le gestionnaire FlowLayout.
Toutes les fenêtres (y compris les cadres et les dialogues) utilisent Border-
Layout.
leContainer.setLayout(null);
leContainer.setLayout(new BorderLayout());
leContainer.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));
Ces méthodes, qui ressemblent à des acquéreurs de propriétés, sont énumérées ci-des-
sous.
Nous recommendons la dernière méthode, plus souple, qui permet un meilleur contrôle
dynamique de la taille du composant: la méthode preferredSize peut retourner l’état de
variables d’instance du composantsaccessibles de l’extérieur.
getAlignmentX()
L'alignement horizontal que voudrait le composant, par rapport aux autres composants.
getAlignmentY()
L'alignement vertical que voudrait le composant, par rapport aux autres composants.
Lorsque la fenêtre interface utilisateur est créée, et que divers composants lui sont ajou-
tés, chaque composant ajouté affecte la taille preferredSize de la fenêtre globale, et
généralement la preferredSize du conteneur fenêtre est agrandie au fur et à mesure
que les composants sont ajoutés. L'effet exact sur la preferredSize dépend du ges-
tionnaire de disposition du conteneur externe, ainsi que des dispositions des conteneurs
imbriqués. Pour plus de détails sur la façon dont est calculée preferredLayoutSize
pour les diverses dispositions, voir les sections de ce document relatives à chaque type
de disposition.
La taille de la fenêtre interface utilisateur, telle qu'elle est définie par votre programme
(avant toute intervention de l'utilisateur), est déterminée par la méthode qui est appelée
en dernier dans le code, parmi les deux suivantes:
pack()
setSize(largeur, hauteur)
setLocation(int x, int y)
L'emplacement de votre interface utilisateur à l'exécution sera 0,0 jusqu'à ce que vous
définissiez la valeur de la propriété location du conteneur (par exemple en appelant set-
Location(..) avant que l'interface ne soit affichée).
Dispositions portables
Les dispositions portables, telles FlowLayout et BorderLayout, calculent leur prefer-
redSize en fonction des règles de disposition et de la taille preferredSize de chaque
composant ajouté au conteneur. Si certains de ces composants sont eux-mêmes des con-
teneurs (un composant Panel, par exemple), alors la taille preferredSize de chacun
d'eux est calculée en fonction de sa disposition et de ses composants, un calcul récurrent
Pour plus d'informations sur le calcul de la taille preferredSize selon les disposi-
tions, voir la description de chaque disposition.
Important
N'oubliez pas que même s'il est possible de définir la taille de votre conteneur
par une largeur et une hauteur données, cela diminue la portabilité de votre
interface utilisateur, puisque la taille des pixels diffère selon les écrans.
validate()
Si vous définissez la taille explicitement en utilisant setSize() de manière
dynamique, - alors par exemple que la fenêtre est déjà affichée -, vous devez
appeler validate() pour que les enfants puissent être correctement disposés
(le validate()revient à opérer une espèce de rafraîchissement).
Par exemple, vous pouvez décider que, au lieu d'appeler pack(), vous afficherez
l'interface utilisateur de sorte qu'elle occupe toujours 75 % de la largeur et de la hauteur
de l'écran. Pour ce faire, ajoutez les lignes de code suivantes à votre application, à la
place de l'appel à pack().
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
frame.setSize( screenSize.width * 3 / 4,
screenSize.height * 3 / 4);
//Centrer la fenêtre
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
FlowLayout[awt]
GridLayout [awt]
BoxLayout [swing]
GridBagLayout [awt]
null
2.5.1 BorderLayout
Le gestionnaire BorderLayout organise les composants d'un conteneur en diverses
zones, appelées NORTH, SOUTH, EAST, WEST et CENTER.
Les composants situés dans les zones NORTH et SOUTH adoptent leur hauteur
préférée (preferredSize) et s'étalent sur toute la largeur du conteneur.
Les composants situés dans EAST et WEST adoptent leur largeur préférée et
s'étalent verticalement sur tout l'espace restant entre les zones nord et sud.
☺ BorderLayout convient pour obliger les composants à se placer le long des côtés d'un
conteneur et pour remplir le centre du conteneur par un composant . C'est la disposi-
tion que l’on utilisera très fréquemment pour qu'un seul composant occupe toute
la surface d'un conteneur.
Un composant est placé dans une des cinq zones d'un BorderLayout, en spécifiant sa
position: NORTH, SOUTH,..
Par exemple:
leContainer.add (unComposant, BorderLayout.NORTH);
Exemple
public BorderLayoutTest() {
// Spécifier un gestionnaire FlowLayout
setLayout(new BorderLayout(5, 5));
2.5.2 FlowLayout
Le gestionnaire FlowLayout organise les composants en lignes, de gauche à droite, puis
de haut en bas, en utilisant la taille préférée de chaque composant (preferredSize): la taille
prévue pour les composants est donc respectée par ce gestionnaire !!
FlowLayout place en ligne autant de composants que possible, avant de recommencer sur
une nouvelle ligne. Généralement, FlowLayout est utilisé pour disposer des boutons sur
un panneau.
Pour créer par exemple un FlowLayout aligné à gauche avec des espacements de 10
pixels horizontalement et verticalement:
new FlowLayout (FlowLayout.LEFT, 10, 10);
Par exemple:
leContainer.add (unComposant);
Exemple
public FlowLayoutTest() {
// Spécifier un gestionnaire FlowLayout
setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
2.5.3 GridLayout
Le gestionnaire GridLayout place les composants sur une grille de cellules en lignes
et en colonnes.
Exemple:
☺
Utilisez GridLayout si vous concevez un conteneur dont tous les composants
doivent avoir la même taille, par exemple un pavé numérique ou une barre
d'outils.
Par exemple, si vous spécifiez quatre colonnes et zéro ligne pour une grille de 15 com-
posants, GridLayout crée quatre colonnes de 4 lignes, la dernière ligne ne contenant
que trois composants.
Ou, si vous spécifiez trois lignes et zéro colonne, GridLayout crée trois lignes et cinq
colonnes complètement remplies.
Par exemple:
leContainer.add (unComposant);
Exemple
public GridLayoutTest() {
2.5.4 BoxLayout
Le gestionnaire de disposition «BoyLayout» est prévu pour aligner les composants selon
un axe horizontal ou un axe vertical (que l’on désignera plus bas comme étant «l’axe
primaire», l’autre axe étant désigné par le terme «axe complémentaire»). Par exemple,
si on choisit l’axe vertical comme axe primaire, les composants seront placés de haut en
bas, en respectant l’ordre d’addition des composants.
Au contraire, s’il s’agit d’un BoxLayout vertical, le gestionnaire tentera de rendre cha-
que composant aussi large que le large parmi tous les composants.
Notons à ce sujet que les composants de type JComponent héritent d’une propriété
d’alignement valant 0.5, indiquant par là qu’ils seront centrés. Mais cette propriété
peut être redéfinie par le composant: il lui suffit de redéfinir les méthodes getAlign-
mentX() et getAlignmentY()héritées de la classe Container, qui retournent une
valeur comprise entre 0.0 et 1.0, où 0.0 signifie un alignement à gauche, et 1.0 un
alignement à droite.
Exemple
public BoxLayoutTest() {
JTabbedPane(int tabPlacement)
Pour créer un panneau à onglets avec un emplacement spécifique des onglets.
Pour plus de détails, voir le 3ème constructeur.
JTabbedPane(int tabPlacement, int tabLayoutPolicy)
Pour créer un panneau à onglets avec un emplacement spécifique des onglets et
une politique de disposition des onglets.
L’emplacement des onglets peut prendre l’une ou l’autre des valeurs suivantes:
JTabbedPane.TOP, JTabbedPane.BOTTOM, JTabbedPane.LEFT, ou
JTabbedPane.RIGHT. Par défaut (1er constructeur): JTabbedPane.TOP
La politique de disposition des onglets peut prendre l’une ou l’autre des valeurs
suivantes: JTabbedPane.WRAP_TAB_LAYOUT ou JTabbed-
Pane.SCROLL_TAB_LAYOUT. Cette politique est mise en oeuvre dès l’instant
qu’il n’y a pas assez de place pour afficher les onglets sur une seule ligne ou
une seule verticale. Par défaut (1er et 2ème constructeur): TOP et
WRAP_TAB_LAYOUT.
addTab(String title,
Icon icon,
Component component,
String tip)
Permet en plus de spécifier un «tooltip» (texte d’aide fugitif) qui serait associé
à l’onglet.
insertTab(String title,
Icon icon,
Component component,
String tip,
int index)
Pour insérer une carte, qui occupera la position indiquée par l’index, passé en
paramètre.
removeAll()
Pour supprimer tous les onglets.
Un exemple
Evénements spécifiques
addChangeListener(ChangeListener l)
Pour inscrire un écouteur de «changement»
removeChangeListener(ChangeListener l)
2.5.6 GridBagLayout
GridBagLayout est une disposition extrêmement souple et puissante qui permet un
meilleur contrôle du positionnement des composants sur la grille que celui fourni par Gri-
dLayout. GridBagLayout positionne les composants horizontalement et verticalement sur
une grille rectangulaire. Il n'est pas nécessaire que les composants soient de même taille,
chacun pouvant remplir plusieurs cellules.
Exemple:
2.5.7 Null
La disposition Null signifie qu'aucun gestionnaire de disposition n'est assigné au conte-
neur. Vous pouvez placer les composants dans le conteneur à des coordonnées spécifi-
ques, x et y, relatives au coin supérieur gauche du conteneur.
Par exemple:
setLayout(null); // Pas de gestionnaire de disposition
JButton b = new JButton("OK");// Un composant ..
b.setBounds (x, y, largeur, hauteur);// Pour spécifier la position
// et la taille du composant
b.setLocation (x, y); // Pour spécifier uniquement la position
Par exemple, le schéma qui suit montre l'utilisation de panneaux imbriqués avec diffé-
rentes dispositions. Les objets en gris représentent des boutons ou d'autres composants
visibles dans l'interface utilisateur imbriqués dans divers niveaux de panneaux.
La mécanique décrite dans ce document correspond au modèle introduit dans Java 1.1,
modèle sur lequel s’appuie la librairie Swing.
Le mécanisme de gestion des événements, basé sur le modèle des listeners, sera pré-
senté au travers d’un petit exemple dont la fenêtre d’exécution comprendrait les élé-
ments suivants:
Au nord: une barre d’outils composée du bouton «Quitter» et de deux labels qui
affichent en temps réel la position courante de la souris dans la zone graphique.
Dans cet exemple, il nous faudra gérer deux types d’événements: le déplacement de la
souris (événements de type MouseMotion) et l’actionnement d’un bouton (événement
de type Action).
Voici le code du programme qui, dans une première étape, se limite à l’affichage de la
fenêtre, sans effectuer aucune gestion d’événement.
//------------------------------------------------------------------------------------------
interface Configuration {
public static int TAILLE_X = 400; // Taille fenêtre en X
public static int TAILLE_Y = 400; // Taille fenêtre en Y
}
//------------------------------------------------------------------------------------------
class PanneauPrincipal extends JPanel
implements Configuration {
// Variables d'instance
private JPanel pNord = new JPanel();
private JButton bQuit = new JButton("Quitter");
private JLabel lX = new JLabel("X > 000");
private JLabel lY = new JLabel("Y > 000");
// Constructeur
public PanneauPrincipal() {
setLayout(new BorderLayout());
add(pNord, BorderLayout.NORTH);
pNord.add (lX);
pNord.add (lY);
pNord.add (bQuit);
setBackground (Color.BLUE);
setPreferredSize
(new Dimension(TAILLE_X, TAILLE_Y));
//------------------------------------------------------------------------------------------
public class Amorce {
public static void main (String [] args) {
JFrame f = new JFrame ("Gestion des ÈvÈnements");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// L'application se termine lorsque la fenÍtre est fermÈe
3.1.1 Le événements
Les événements auxquels nous nous intéressons correspondent à des changements
d’état subits par les objets qui composent l’interface graphique avec l’utilisateur (me-
nus, boutons, comboBox, ..).
Par exemple, les objets de type JButton sont susceptibles de générer les événements
suivants:
Par exemple, pour s’abonner auprès d’un bouton à un événement de type Action, il
suffira à un objet «objetX» de s’enregistrer en tant qu’auditeur pour ce type d’événe-
ment:
leBouton.addActionListener(objetX);
Si le même objet désire s’abonner aux événements de type Component, il le fera ainsi:
leBouton.addComponentListener(objetX);
Lorsqu’un événement est déclenché, le message correspondant sera diffusé par l’objet
source à tous les écouteurs qui se seront inscrits au préalable pour le type d’événement
concerné. Si aucun écouteur ne s’est inscrit, l’événement sera simplement ignoré, sans
occasionner aucune perte de temps.
Ecouteur 1
Ecouteur 2
"unBouton"
Source d'événement
Ecouteur 3
Les événements sont des instances de classes spécifiques que l’on appelle des types
d’événements.
Notons, et nous y reviendrons un peu plus loin, qu’un auditeur devra s’abonner à toute
une catégorie d’événements à la fois, même si certains événements de cette catégorie
ne l’intéressent pas. Il devra ainsi prévoir un gestionnaire d’événements pour chacun
des événements de la catégorie.
vement pressée puis relâchée sur le même bouton (deux événements de bas
niveau).
☺ A chaque catégorie d’événement correspond une classe de même nom, terminé par le
mot Event, comme par exemple ActionEvent pour la catégorie Action. Pour obte-
nir plus d’informations sur l’événement, il est recommandé de consulter la documenta-
tion de la classe correspondante, directement dans l’API du JDK.
Dans les tableaux qui suivent, les événements dont l’explication commence par [awt]
sont issus historiquement de l’awt, la première librairie graphique de Java. Les autres
appartiennent exclusivement à la librairie Swing (à partir de Java 1.2).
Notons que les événements de type Container n’ont de sens qu’auprès des compo-
sants Swing qui jouent le rôle de conteneur: JFrame, JPanel, JTabbedPane, etc.. ou
de composite, comme par exemple JComboBox.
etc..
A titre d’exemple, la consultation de cet arbre nous indique que le composant JButton
peut générer les types d’événements suivants:
☺ Se référer aux deux tableaux présentés plus haut pour une brève explication de chacun
de ces types d’événements[Voir tableau- Voici les événements dits «de base» - page 41], [Voir
tableau- Evénements dits «sémantiques» - page 42].
Component
Focus
Key
JColorChooser
Mouse
Dialog JDialog
MouseMotion Window
MouseWheel
JOptionPane
JComponent
JProgressBar
Ancestor AbstractButton Change
PropertyChange JCheckBoxMenuItem
VetoableChange Action
Change
JRootPane
Item
JButton JMenu
Menu
JLabel
JList JRadioButton JSplitPane
ListSelection
ListModel JTabbedPane modèle de colonne TableColumnModel
JMenuBar associé
modèle associé Change TableColumnModel
ListData
modèle associé TableModel
JPanel JTable TableModel
modèle associé Document
éditeur de cellule
Document CellEditor
associé
UndoableEdit JToolBar Change
JPopupMenu
PopupMenu
JToolTip modèle associé TreeModel
JScrollBar TreeModel
JEditorPane JTree
Adjustment JTextPane modèle de sélection TreeSelectionModel
Hyperlink associé TreeSelection
JScrollPane TreeExpansion
PropertyChange
TreeSelection
JTextArea éditeur de cellule
TreeCellEditor
associé
JViewport Change
JTextComponent Change
JTextField
Caret JPasswordField
InputMethod Action JInternalFrame.JDesktopIcon
La gestion des événements
Swing - 47 - La gestion des événements
où
leComposant désigne le composant graphique auprès duquel on désire
s'abonner
XXX désigne la catégorie d'événements concernée (Action, MouseMo-
tion, ..)
auditeur désigne l'objet qui se met à l'écoute des événements
interface ActionListener {
public void actionPerformed (ActionEvent e);
}
interface MouseMotionListener {
public void mouseMoved (MouseEvent e);
public void mouseDragged (MouseEvent e);
}
Voici deux nouveaux tableaux qui décrivent toutes les interfaces mises à disposition:
La première colonne indique le nom de l’interface;
La deuxième colonne indique le nom de la classe d’adaptation correspondante
(si elle existe), [Voir paragraphe - Exemple: solution no3 - page 53];
La troisième, enfin, donne la liste des méthodes contenues dans l’interface,
implémentées par l'auditeur
Nous reviendrons sur la notion de classe d’adaptation [Voir paragraphe - Exemple: solution
no3 - page 53].
Interface Methodes
ActionListener actionPerformed(ActionEvent)
AdjustmentListener ajustmentValueChanged(AjustmentEvent)
AncestorListener ancestorAdded (AncestorEvent)
ancestorMoved (AncestorEvent)
ancestorRemoved (AncestorEvent)
CaretListener caretUpdate (CaretEvent)
CellEditorListener editingCanceled (ChangeEvent)
editingStopped (ChangeEvent)
ChangeListener stateChanged (ChangeEvent)
DocumentListener changedUpdate (DocumentEvent)
insertUpdate (DocumentEvent)
removeUpdate (DocumentEvent)
HyperlinkListener hyperlinkUpdate (HyperlinkEvent)
InternalFrameListener internalFrameActivated (InternalFrameEvent)
internalFrameClosed (InternalFrameEvent)
internalFrameClosing (InternalFrameEvent)
internalFrameDeactivated (InternalFrameEvent)
internalFrameDeiconified (InternalFrameEvent)
internalFrameIconified (InternalFrameEvent)
internalFrameOpened (InternalFrameEvent)
ItemListener itemStateChanged (ItemEvent)
ListDataListener contentsChanged (ListDataEvent)
intervalAdded (ListDataEvent)
intervalRemoved (ListDataEvent)
ListSelectionListener valueChanged (ListSelectionEvent)
MenuDragMouseListener menuDragMouseDragged (MenuDragMouseEvent)
menuDragMouseEntered (MenuDragMouseEvent)
menuDragMouseExited (MenuDragMouseEvent)
menuDragMouseReleased (MenuDragMouseEvent)
MenuKeyListener menuKeyTyped (MenuKeyEvent)
MenuListener menuCanceled (MenuEvent)
menuDeselected (MenuEvent)
menuSelected (MenuEvent)
MouseInputListener mouseClicked (MouseEvent)
(implements MouseListe- mouseDragged (MouseEvent)
ner & MouseMotionListe-
ner) mouseEntered (MouseEvent)
mouseExited (MouseEvent)
mouseMoved (MouseEvent)
mousePressed (MouseEvent)
mouseReleased (MouseEvent)
PopupMenuListener popupmenuCanceled (PopupMenuEvent)
popupMenuWillBecomeInvisible (PopupMenuEvent)
popupMenuWillBecomeVisible (PopupMenuEvent)
TableColumnModelListe- columnAdded (TableColumnModelEvent)
ner columnMarginChanged (ChangeEvent)
columnMoved (TableColumnModelEvent)
columnRemoved (TableColumnModelEvent)
columnSelectionChanged (ListSelectionEvent)
Au contraire des événements dits «de base», il existe peu de classes Adapter pour les
événements sémantiques. Ainsi, si le programmeur ne s’intéresse qu’à un seul des évé-
nements d’une même catégorie, il aura quand même l’obligation d’implémenter toutes
les méthodes de l’interface. Les seules classes Adapter prévues sont les suivantes:
InternalFrameAdapter,
MouseInputAdapter,
WindowAdapter
Pour plus d’informations, [Voir paragraphe - Exemple: solution no3 - page 53].
import java.awt.*;
import javax.swing.*;
//------------------------------------------------------------------------------------------
interface Configuration {
public static int TAILLE_X = 400; // Taille fenêtre en X
public static int TAILLE_Y = 400; // Taille fenêtre en Y
}
//------------------------------------------------------------------------------------------
class PanneauPrincipal extends JPanel
implements Configuration,
ActionListener, MouseMotionListener{
// Variables d'instance
private JPanel pNord = new JPanel();
private JButton bQuit = new JButton("Quitter");
private JLabel lX = new JLabel("X > 000");
private JLabel lY = new JLabel("Y > 000");
// Constructeur
public PanneauPrincipal() {
setLayout(new BorderLayout());
add(pNord, BorderLayout.NORTH);
pNord.add (lX);
pNord.add (lY);
pNord.add (bQuit);
setBackground (Color.BLUE);
setPreferredSize
(new Dimension(TAILLE_X, TAILLE_Y));
bQuit.addActionListener(this);
addMouseMotionListener(this);
}
// Gestionnaires d'événements
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
//------------------------------------------------------------------------------------------
public class Amorce {
public static void main (String [] args) {
JFrame f = new JFrame ("Gestion des ÈvÈnements");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// L'application se termine lorsque la fenÍtre est fermÈe
Ces dernières seront en général déclarées sous la forme de classes imbriquées dans la
classe du container. L’imbrication leur permet d’accéder directement aux variables
d’instance du container. Dans notre exemple, la classe EcouteurSouris accède
directement aux deux labels lX et lY.
// Variables d'instance
private JPanel pNord = new JPanel();
private JButton bQuit = new JButton("Quitter");
private JLabel lX = new JLabel("X > 000");
private JLabel lY = new JLabel("Y > 000");
// Constructeur
public PanneauPrincipal() {
setLayout(new BorderLayout());
add(pNord, BorderLayout.NORTH);
pNord.add (lX);
pNord.add (lY);
pNord.add (bQuit);
setBackground (Color.BLUE);
setPreferredSize (new Dimension(TAILLE_X, TAILLE_Y));
bQuit.addActionListener(new EcouteurBouton());
addMouseMotionListener(new EcouteurSouris());
}
}
Le tableau présenté plus haut [Voir tableau- Les interfaces «Listener» des événements «de
base» - page 48] donne la liste des classes d’adaptation pour les événements «de base».
C’est aussi cette solution que l’on peut utiliser pour gérer la fermeture de la fenêtre
directement au niveau de la barre de titre. L’interface WindowListener comporte en
effet pas moins de 7 gestionnaires qu’il faudrait implémenter si on mettait en oeuvre la
solution no 2 !!
// Classes internes
class EcouteurFenetre extends WindowAdapter {
public void windowClosing (WindowEvent e) {
System.exit(0);
}
}
:
// Constructeur
public Fenetre () {
this.addWindowListener (new EcouteurFenetre ());
:
Cette dernière solution, encore peu usitée, utilise le mécanisme de classe anonyme: la
classe de l’écouteur est écrite au moment même de l’instanciation de l’objet écouteur.
En opérant ainsi, on localise très fortement les instructions qui ont trait à la même fonc-
tionnalité:
Concept donc très intéressant, même s’il peut étonner de prime abord.
// Constructeur
public PanneauPrincipal() {
setLayout(new BorderLayout());
add(pNord, BorderLayout.NORTH);
pNord.add (lX);
pNord.add (lY);
pNord.add (bQuit);
setBackground (Color.BLUE);
setPreferredSize (new Dimension(TAILLE_X, TAILLE_Y));
bQuit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseMoved (MouseEvent e) {
lX.setText ("X > " + e.getX());
lY.setText ("Y > " + e.getY());
}
});
}
}
Annexe C Index
C
catégorie d’événement 40
classe d’adaptation 53
E
écouteur d’événement 38
événement 38
catégorie 40
de base 40
écouteur 38
gestionnaire 40
interroger 43
sémantique 40
source 38
thread de traitement 44
type 40, 44
G
gestionnaire d’événement 40
S
source d’événement 38
surface utile 3
T
type d’événement 40