Programmation Java Swing/Introduction
Principes
modifierLa bibliothèque de composants Swing est définie dans le package javax.swing
et utilise AWT (java.awt
) :
- La gestion des évènements est celle des composants AWT basée sur les mêmes écouteurs d'évènements.
- Les types
Color
,Font
,Dimension
,Insets
... du packagejava.awt
sont utilisés par Swing également. - Les gestionnaires de disposition des composants définis par AWT sont également utilisés par les conteneurs Swing.
- Les composants Swing dérivent tous du composant de base défini par la classe
javax.swing.JComponent
. Cette classe dérive de la classejava.awt.Container
. Cela signifie que tout composant Swing peut contenir d'autres composants. Cependant, le conteneur privilégié est le panel défini par la classejavax.swing.JPanel
.
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
modifierLa fenêtre la plus simple est une classe vide héritant de la classe javax.swing.JFrame
qui est vide par défaut.
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, comme illustré par la méthode statique main
ci-dessous pour créer et afficher la fenêtre :
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 :
- Copiez le code source dans un fichier nommé
FenetreSimple.java
dans une hiérarchie de répertoireorg/wikibooks/fr/swing
pour le paquetage déclaré ; - Compilez-le avec la commande
javac org.wikibooks.fr.swing.FenetreSimple
- Lancez le programme avec la commande
java -cp . org.wikibooks.fr.swing.FenetreSimple
- ou comme il n'est pas nécessaire d'avoir une console :
javaw -cp . org.wikibooks.fr.swing.FenetreSimple
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 main
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
}
});
}
}