Introduction à Swing

Les programmes à interfaces graphiques (GUI en anglais pour Graphic User Interface) font usage des classes de l'AWT (Abstract Windowing Toolkit) et/ou de Swing. L'AWT est en fait l'ancêtre de Swing qui a été introduit par la suite. Par contre, Swing ne remplace l'AWT puisqu'il est basé dessus. Il y a une certaine redondance entre AWT et Swing. Il y a par exemple une classe Button en AWT et une classe JButton en Swing. De manière générale, les noms des classes Swing commencent par la lettre 'J'.

Les caractérisitiques principales de Swing sont les suivantes.

La classe de base de tous les objets est Component en AWT et JComponent en Swing. La classe JComponent dérive de la classe Component. Ce sont deux classes abstraites.

Parmi les objets, on distingue trois catégories.

Arborescence des composants et des conteneurs

L'interfacce visible d'une application est constitué par un ensemble de composants et des conteneurs. Ces objets sont organisés en une arborescence semblable à celle des fichiers et des répertoires. Les composants jouent le rôle des fichiers et les conteneurs jouent le rôle des répertoire. Il y a un arbre pour chaque fenêtre. La racine de chaque arbre est un conteneur spécial qui réalise la liaison avec les système de fenêtrage sous-jacent.

Sur la figure ci-dessous est dessinée une partie de l'arbrorescence de l'application Totale utilisée pour illustrer les composants de Swing. Chaque rectangle représente un objet avec le nom de la variable dans le programme et le type de cette variable. Le conteneur à la racine de l'arbrorescence est une fenêtre JFrame qui contient d'une part une barre de menus (JMenuBar) et un panneau (JPanel) qui contient tout le reste. Ce dernier panneau contient lui-même d'autres panneaux dans lesquels sont regroupés les composnants proprement dits. La barre de menus contient trois menus (Jmenu) qui contiennnent eux-mêmes des composants pour les entrées des menus (JMenuItem).



Fig. 1 : Arborescence (partielle) de l'application Totale

Ils ne faut pas confondre l'arborescence des objets dans une interface avec la hiérarchie des classes liée à la dérivation en programmation orientée objets.

Conteneurs

Les conteneurs contiennent d'autre objets qui peuvent être eux-mêmes des conteneurs. Ils sont responsables de la disposition des objets qu'ils délèguent à un gestionnaire de disposition (LayoutManager en anglais). La classe de base des conteneurs est Container qui dérive de Component. Il n'y a pas de classe JContainer en Swing. Les conteneurs principaux sont les suivants.

Les conteneurs Window, JWindow, Frame, JFrame, Applet et JApplet se trouvent nécessairement à la racine d'une arborescence. Ils ne peuvent pas être contenus dans un autre conteneur. Ces classes dérivent toutes de la classe Container. Au contraire, les conteneurs doivent être contenus dans un autre conteneur. Les classes Panel et JPanel dérivent respectivement de Component et JComponent.

Les classes Frame ou JFrame sont utilisées pour la fenêtre principale d'une application autonome (comme pour l'application Totale). Elles sont le conteneurs à la racine de la fenêtre pricipale. Les classes Window ou JWindow sont utilisées lorsque l'interface d'une application est répartie entre plusieurs fenêtres. Les fenêtres auxiliares sont les conteneurs à la racines des fenêtres auxiliaires. Les classes Applet et JApplet sont les conteneurs à la racine de l'arbrorescence des applettes.

Les conteneurs Panel et JPanel sont utilisés pour regrouper les composants en blocs. C'est en quelque sorte le conteneur universel.

Hiérarchie des classes Swing

Hiérarchie des conteneurs

Voici la hiérarchie des conteneurs principaux de SWING.

Il peut paraître surprenant que Container dérive de Component et non pas l'inverse. Un composant quelconque n'est pas conteneur puisqu'il ne peut pas contenir d'autres composants. Au contraire, un conteneur peut être vu comme un composant lorsqu'il est inclus dans un autre conteneur.

Une JFrame contient une fille unique de classe JRootPane qui elle-même contient un glassPane de classe JPanel et un layeredPane de classe JLayeredPane. Ce layeredPane contient un contentPane de classe JPanel et un menuBar de classe JMenuBar.

Hiérarchie des composants

Voici une (très petite) partie de la hiérarchie des classes des composants SWING.

SWING utilise intensément la programmation orientée objet. Il y a par exemple sept niveaux de dérivation entre la classe Object et la classe JRadioButton. On a en effet les dérivations

Object → Component → Container → JComponent → AbstractButton → JToggleButton → JRadioButton