Programmation Java Swing/Introduction
Principes.
La bibliothèque de composants Swing est définie dans le package codice_1 et utilise AWT (codice_2) :
Le nom des classes Swing reprend le nom de la classe équivalente AWT préfixé par la lettre J : JComponent, JContainer, JPanel, JFrame...
Fenêtres simples.
La fenêtre la plus simple est une classe vide.
Pour les opérations de mise à jour graphiques il vaut mieux utiliser le thread dédié (thread de répartition des évènements graphiques) pour éviter les problèmes de synchronisation :
package org.wikibooks.fr.swing;
import java.awt.*;
import javax.swing.*;
 * Fenêtre simple.
 * @author fr.wikibooks.org
public class FenetreSimple extends JFrame
 public static void main(String[] args)
 // Utiliser le thread dédié à l'interface graphique
 // pour les opérations graphiques :
 EventQueue.invokeLater(new Runnable()
 public void run()
 FenetreSimple frame = new FenetreSimple(); // Créer
 frame.setVisible(true); // Afficher
 });
Pour tester cet exemple :
La fenêtre ne comporte pas de titre, de taille réduite et située en haut à gauche, le bouton de fermeture permet toutefois de fermer la fenêtre.
Cependant, l'application tourne encore. On s'en aperçoit en lançant l'application avec un IDE (tel Eclipse).
Le thread de répartition des évènements graphiques continue de tourner.
Pour que l'application s'arrête (fin de tous les threads), il est nécessaire d'ajouter un écouteur d'évènement sur la fermeture de la fenêtre.
L'exemple ci-dessous montre cela et comment définir un titre, la taille et la position de la fenêtre dans le constructeur de la classe.
La méthode codice_16 de lancement de l'application reste la même :
package org.wikibooks.fr.swing;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 * Fenêtre simple.
 * @author fr.wikibooks.org
public class SecondeFenetreSimple extends JFrame
 public SecondeFenetreSimple()
 setTitle("Une deuxième fenêtre simple");
 setSize(new Dimension(600,400));
 setLocation(new Point(200, 100));
 setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 addWindowListener(new WindowAdapter()
 /* (non-Javadoc)
 * @see java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent)
 @Override
 public void windowClosing(WindowEvent e)
 dispose();
 System.exit(0);
 });
 public static void main(String[] args)
 // Utiliser le thread dédié à l'interface graphique
 // pour les opérations graphiques :
 EventQueue.invokeLater(new Runnable()
 public void run()
 SecondeFenetreSimple frame = new SecondeFenetreSimple(); // Créer
 frame.setVisible(true); // Afficher
 });

Programmation Java Swing/Sommaire
Programmation Java Swing/Gestion de la disposition des composants

La disposition des composants n'est pas définie directement par le conteneur mais par le gestionnaire de disposition des composants ("Layout manager" en anglais).
Informations utilisées et contrainte associée.
Le gestionnaire peut utiliser différentes informations fournies par le composant :
Les gestionnaires de disposition ne respectent pas tous les trois contraintes précédentes définies par le composant.
Le code typique de création d'un conteneur avec gestionnaire de disposition est le suivant :
// Créer le conteneur et lui associer le gestionnaire de disposition
"Conteneur" c = new "Conteneur"()
c.setLayout(new "GestionnaireDeDisposition"("arguments..."));
// Ajouter les composants avec une contrainte de disposition
c.add("composant", "contrainte");
Exemple :
JPanel p_main = new JPanel();
p_main.setLayout(new BorderLayout());
// Titre en haut (au nord)
JLabel label_titre = new JLabel("Titre ici");
p_main.add(label_titre, BorderLayout.NORTH);
// Panel de vue des données au centre
JPanel p_view = new JPanel();
p_main.add(p_view, BorderLayout.CENTER);
// Panel des boutons en bas (au sud)
JPanel p_boutons = new JPanel();
p_main.add(p_boutons, BorderLayout.SOUTH);
Gestionnaires de disposition prédéfinis.
Les interfaces codice_4 et codice_5 sont définies par une variété de classes définissant différentes façon de disposer les composants :
Le gestionnaire de disposition doit être assigné au conteneur soit en le passant au constructeur, soit en appelant la méthode codice_7 après construction du conteneur. Exemple:
JPanel p_main = new JPanel(new BorderLayout());
Pour BoxLayout, l'utilisation de la méthode codice_7 est obligatoire car le constructeur a besoin de l'instance du conteneur :
JPanel p_main = new JPanel();
p_main.setLayout(new BoxLayout(p_main, BoxLayout.Y_AXIS));
// L'appel à setLayout doit se faire avec le même conteneur que celui passé à BoxLayout
// sinon l'exception suivante est levée :
// java.awt.AWTError: BoxLayout can't be shared
Disposition par défaut des conteneurs.
Un conteneur possède un gestionnaire de disposition par défaut.