Programmation Java Swing/Composants
De manière générale, un composant dans une interface graphique possède une zone rectangulaire permettant d'afficher une ou plusieurs informations et permet à l'utilisateur d'interagir avec lui en utilisant la souris ou le clavier.
Divers composants.
Cette section liste brièvement quelques composants Swing décrits plus en détails dans les sections suivantes.
Les composants Swing sont nombreux, seuls les plus courants seront décrits ici.
Architecture logicielle.
Les composants Swing utilisent l'architecture MVC (modèle vue contrôleur) :
Taille et position.
En général et par défaut, la taille et la position des composants dans un conteneur sont définies par un gestionnaire de disposition des composants.
Elles ne peuvent donc être modifiées qu'en cas d'absence de gestionnaire de disposition (codice_1).
Cependant, il est recommandé d'utiliser l'un des gestionnaires de disposition des composants pré-existants.
Position.
Comme en AWT, la position d'un composant est définie par deux coordonnées x et y, qui peuvent être représentées par un objet de classe codice_2. Cette classe comporte deux champs publics codice_3 et codice_4 de type entier (codice_5).
Taille.
La taille d'un composant est définie par la largeur ("width" en anglais) et la hauteur ("height" en anglais), qui peuvent être représentées par un objet de classe codice_6. Cette classe comporte deux champs publics codice_7 et codice_8 de type entier (codice_5).
Utiliser un objet au lieu de spécifier directement les valeurs permet de réutiliser les mêmes valeurs pour d'autres composants, ou pour définir la taille minimales, maximales et préférées d'un composants, ou de réutiliser les valeurs retournées par un composant.
Taille et position.
La taille et la position peuvent être définies en une fois en utilisant les méthodes ci-dessous, soit en spécifiant les 4 valeurs, soit en utilisant un objet de classe codice_10. Cette classe comporte quatre champs publics de type entier (codice_5) : codice_3 et codice_4 pour la position, et codice_7 et codice_8 pour la taille.
Propriétés d'apparence.
Certaines propriétés communes aux composants changent leur apparence :
Propriétés de comportement (état).
Suite à la réactivation d'un champ texte, soit par la méthode codice_46, soit par la méthode codice_47, il peut arriver que le curseur n'apparaisse pas, même quand le focus est sur le champ.
La solution, après réactivation, est de rendre visible le curseur explicitement :
textinput.getCaret().setVisible(true);
Composants.
Pour tester rapidement les composants des sections qui suivent, voici un code source Java créant une fenêtre de test.
package org.wikibooks.fr.swing;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
 * Fenêtre pour tester les composants.
 * @author fr.wikibooks.org
public class FenetreTestComposants extends JFrame
 public FenetreTestComposants()
 // Configurer la fenêtre
 setTitle("Composants");
 setSize(new Dimension(600,400)); // Taille initiale de la fenêtre
 setLocation(new Point(200, 100)); // Position initiale de la fenêtre
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 // Création du panel pour le contenu de la fenêtre
 JPanel contentPane = new JPanel();
 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
 setContentPane(contentPane);
 // Copier/Écrire ici le code pour créer le composant comme celui donné dans les sections suivantes.
 // composant = new ... ( ... );
 contentPane.add(composant); // remplacer "composant" par le nom de la variable utilisée.
 public static void main(String[] args)
 EventQueue.invokeLater(new Runnable()
 public void run()
 FenetreTestComposants frame = new FenetreTestComposants(); // Créer
 frame.setVisible(true); // Afficher
 });
JLabel.
Ce composant permet d'afficher du texte et une icône.
// Convention : l_ pour label
// Un label pour le nom de l'application :
JLabel l_nom_app = new JLabel("Apprentissage Java Swing sur fr.wikibooks.org");
// Les lignes suivantes sont optionnelles mais permettent de configurer le composant
l_nom_app .setFont(new Font("Tahoma", Font.BOLD, 36)); // Police "Tahoma", en gras, 36 pixels
Dans la fenêtre de test, une largeur de 600 pixels ne suffit pas à afficher tout le texte.
Le composant coupe le texte avant 600 pixels et affiche des points de suspension.
Pour afficher un texte sur plusieurs lignes, l'utilisation de caractère de retour à la ligne codice_48 ou codice_49 n'ont aucun effet.
Il faut utiliser un format HTML :
// Convention : l_ pour label
// Un label pour le nom de l'application :
JLabel l_nom_app = new JLabel("<html>Apprentissage Java Swing<br>sur fr.wikibooks.org</html>");
// Les lignes suivantes sont optionnelles mais permettent de configurer le composant
l_nom_app .setFont(new Font("Tahoma", Font.BOLD, 36)); // Police "Tahoma", en gras, 36 pixels
Le constructeur a trois paramètres optionnels :
JLabel(String text, Icon icon, int horizontalAlignment).
Quand un texte et une image sont affichés, l'image est à gauche du texte par défaut.
La méthode codice_56 permet de choisir la position du texte relativement à l'image :
Label activant un composant.
Un label peut être utilisé pour activer le composant associé.
Par exemple, mettre le focus sur un champ de saisie quand l'utilisateur tape la touche mnémonique associée au label.
JButton.
Ce composant permet de déclencher une action par un clic de souris.
// Convention : b_ pour button
JButton b_configurer = new JButton("Configurer...");
b_configurer.addActionListener(new ActionListener()
 public void actionPerformed(ActionEvent e)
// N.B. : Définir la méthode configurer() appelée par le bouton dans la classe
JTextfield.
Un champ de saisie de texte simple.
La classe codice_57 hérite de codice_38 définissant les méthodes pour les champs de saisie.
// Convention : tf_ pour text field
JTextField tf_titre_livre = new JTextField();
// Ajouter une bulle d'information pour l'utilisateur s'affichant au survol de la souris :
tf_titre_livre.setToolTipText("Titre d'un livre");
String livre = "Programmation Java Swing";
tf_titre_livre.setText(livre); // Initialiser la valeur dans le champ de saisie
// Plus tard, lors d'une action :
livre = tf_titre_livre.getText(); // Récupérer la valeur du champ saisie par l'utilisateur
JPasswordField.
Un champ permettant la saisie d'un mot de passe, cachant les caractères tapés.
La classe codice_42 hérite de codice_38 définissant les méthodes pour les champs de saisie.
Cette classe possède donc les mêmes méthodes que codice_57.
// Convention : pf_ pour password field
JPasswordField pf_connexion = new JPasswordField(); // Mot de passe de connexion
// Ajouter une bulle d'information pour l'utilisateur s'affichant au survol de la souris :
pf_connexion.setToolTipText("Entrez le mot de passe de connexion");
pf_connexion.setText(""); // Initialiser la valeur dans le champ de saisie
// Plus tard, lors d'une action :
// String mot = pf_connexion.getText(); // Récupérer la valeur du champ saisie par l'utilisateur
// Obsolète, ne pas utiliser dans les applications sécurisées, voir ci-dessous.
char[] mot = pf_connexion.getPassword(); // Récupérer la valeur du champ saisie par l'utilisateur
// Comme mentionné dans la documentation de la méthode getPassword(),
// pour plus de sécurité, il est recommandé d'effacer le contenu
// du tableau retourné après usage en le remplissant de zéro.
Arrays.fill(mot, '\0');
// Ceci n'est pas possible avec le type String immuable, expliquant pourquoi
// il ne faut pas utiliser la méthode getText().
JTextArea.
Une zone de saisie de texte.
JTextPane.
Une zone d'affichage ou de saisie de texte formaté.
JCheckBox.
Une case à cocher.
// Convention : cb_ pour check box
cb_resume = new JCheckBox("Avec résumé");
// Ajouter une bulle d'information pour l'utilisateur s'affichant au survol de la souris :
cb_resume.setToolTipText("Générer un résumé du livre");
cb_resume.setSelected(true); // Initialiser la case : cochée [X]
cb_resume.setSelected(false); // ou non cochée [ ]
// Plus tard, lors d'une action :
boolean avec_resume = cb_resume.isSelected(); // Récupérer l'état choisi par l'utilisateur
Ce composant gère deux états, mais pas d'état intermédiaire (coché partiellement ou indéterminé).
Mais il est possible de créer un composant ayant ce troisième état : voir le chapitre avancé « ../Créer une case à cocher à trois états/ ».
JRadioButton.
Un bouton radio, permettant de sélectionner un item parmi plusieurs dans un groupe.
La classe codice_62 possède plusieurs constructeurs qui permettent d'initialiser le texte affiché, l'image d'icône, et l'état initial (booléen, sélectionné ou non).
La classe codice_63 n'est pas un composant mais représente un groupe de boutons abstraits (JRadioButton, JToggleButton, ...) dont seul l'un d'entre eux peut être sélectionné à la fois.
La sélection de l'un d'eux entraîne la dé-sélection des autres.
Exemple :
// Convention : bg_ pour button group
ButtonGroup bg_theme = new ButtonGroup();
// Convention : rb_ pour radio button
JRadioButton rb_theme_clair = new JRadioButton("Thème clair");
bg_theme.add(rb_theme_clair); // Ajout au groupe
JRadioButton rb_theme_sombre = new JRadioButton("Thème sombre");
bg_theme.add(rb_theme_sombre); // Ajout au groupe
JRadioButton rb_theme_sepia = new JRadioButton("Thème sépia");
bg_theme.add(rb_theme_sepia); // Ajout au groupe
Gestion de sélection :
bg_theme.clearSelection(); // Tous dé-sélectionnés
// Sélectionner un bouton radio :
rb_theme_clair.setSelected(true);
// Connaître l'état de sélection :
boolean avec_theme_clair = rb_theme_clair.isSelected();
JComboBox.
Une liste déroulante de choix (un seul choix possible).
JList.
Une liste d'items, un ou plusieurs items sélectionnable.
Le constructeur accepte un tableau d'objets (leur méthode codice_64 est appelé pour le texte à afficher) ou un modèle de liste codice_65.
L'utilisation d'un modèle de liste est recommandée quand la liste des items est modifiable par l'utilisateur.
final Object[] JOURS = { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" };
// Indice : 0 1 2 3 4 5 6
// Convention : ls_ pour list
JList ls_jours = new JList(JOURS);
Ce composant a plusieurs modes de sélection :
// Mode de sélection : un seul
ls_jours.setselectionMode(ListSelectionModel.SINGLE_SELECTION);
ls_jours.setSelectedIndex(2); // Mercredi
// Plus tard, durant une action :
int index_jour = ls_jours.getSelectedIndex();
// Mode de sélection : un seul intervalle
ls_jours.setselectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
ls_jours.setSelectionInterval(2, 4); // Du mercredi au vendredi inclus
// Plus tard, durant une action :
int[] indexs_jour = ls_jours.getSelectedIndices();
// Mode de sélection : plusieurs intervalles
ls_jours.setselectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// Soit tous les indices :
ls_jours.setSelectedIndices(new int[]{0,1,2, 4,5}); // Lundi, mardi, mercredi, vendredi, samedi
// Soit les intervalles :
ls_jours.setSelectionInterval(0, 2); // Du lundi au mercredi inclus
ls_jours.addSelectionInterval(4, 5); // et ajouter du vendredi au samedi inclus
// Plus tard, durant une action :
int[] indexs_jour = ls_jours.getSelectedIndices();
La taille de la liste est déterminée par le nombre d'items.
Ce composant ne gère pas le défilement.
Il faut l'englober dans un composant JScrollPane pour gérer le défilement d'une longue liste dans un espace plus réduit.
JSpinner.
Champ de saisie avec boutons d'incrémentation et de décrémentation (nombre, items dans une liste prédéfinie, ...).
JSlider.
Sélection d'une valeur numérique par glissement d'un curseur sur une ligne.
JProgressBar.
Barre de progression.
JTree.
Arborescence de nœuds pour les données structurées.
JTable.
Table de données.
JScrollbar.
Une barre de défilement.
Ce composant est rarement utilisé directement car il est de bas niveau et est utilisé notamment par JScrollPane qui gère la vue partielle, le défilement et les entêtes.
JPanel.
Un conteneur générique, comme le codice_66 de la fenêtre de test.
Un panel, comme sa classe de base codice_67, peut contenir tout type de composant, y compris d'autres panels.
L'imbrication de panels permet de subdiviser un panel en plusieurs panels indépendant et réutilisables ayant leur propre configuration (gestionnaire de disposition, couleur de fond, ...).
// Convention : p_ pour panel
JPanel p_outils = new JPanel(); // un panel pour les outils de l'application
// Configuration :
p_outils.setBorder(new EmptyBorder(5, 5, 5, 5)); // bordure vide de 5 pixels dans les 4 directions
p_outils.setLayout(new FlowLayout()); // gestionnaire de disposition
JScrollPane.
Un conteneur permettant de faire défiler le contenu du composant (la vue) lorsque sa taille dépasse les limites du conteneur.
Ce type de panel est notamment utilisé avec les listes ayant plus de 3 ou 5 items, les tables, les arborescences, les panels ayant un contenu occupant une grande surface.
Ce composant comporte en fait neufs zones illustrées ci-dessous :
// Convention : sp_ pour scroll pane
JScrollPane sp_pages = new JScrollPane();
sp_pages.setViewportView(table_pages); // configurer la vue (view) du JViewport