Programmation Java Swing/Introduction

Un livre de Wikilivres.

Principes[modifier | modifier le wikicode]

La 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 package java.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 classe java.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 classe javax.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[modifier | modifier le wikicode]

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 :

  1. Copiez le code source dans un fichier nommé FenetreSimple.java dans une hiérarchie de répertoire org/wikibooks/fr/swing pour le paquetage déclaré ;
  2. Compilez-le avec la commande
    javac org.wikibooks.fr.swing.FenetreSimple
  3. 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
			}
		});
	}
}