Swing
Les interfaces graphiques en Java utilisent l'AWT
: Abstract Window Toolkit. Depuis la version
2 du JDK, il existe une surcouche à l'AWT, appelée Swing.
Cette surcouche a l'avantage d'être plus puissante que l'AWT. De
plus, Swing est écrite uniquement en Java, son usage facilite donc
la portabilité des logiciels.
Swing est décrite de façon très exhaustive (mais
hélas peu concise) dans un tutoriel disponible en ligne : The
JFC Swing Tutorial. Cette page reprend uniquement certains points
important de ce tutoriel de façon à en faciliter l'accès.
Exemple simple
Ce premier exemple simple montre comment créer
un bouton dans une fenêtre et lui associer une action, ici augmenter
de 1 l'entier affiché dans le bouton : v1/MonBouton.java.
Cette version utilise une classe interne anonyme pour créer l'instance
d'ActionListener qui spécifie le comportement du bouton.
On trouvera aussi souvent comme style de programmation une classe regroupant
un composant et son comportement (v0/MonBouton.java).
Composants
Tous les composants Swing sont des instances de classes dont le nom commence
par J, suivi du type du composant (par exemple JButton). Ces composants
sont regroupés dans le paquetage javax.swing.
Il existe 3 types de composants "top-level"
-
JFrame
Ce composant sert de base à l'interface graphique d'une application.
On en trouve souvent une seule instance, créée dans le main(String
[]) de l'application.
-
JDialog
Les dialogues sont également des composants "top-level". Ils
restent toutefois assujettis à une fenêtre de type frame.
Ainsi, si la frame dont ils dépendent est iconifiée, ils
sont également iconifiés.
-
JApplet
Ce composant sert de base à une interface graphique destinée
à être télé-chargée.
Tous les composants qui ne sont pas "top-level" sont des JComponent.
Les composants intermédiaires sont dédiés à
la géométrie. Ils sont destinés principalement à
accueillir des composants de base.
-
JPanel
C'est le composant de base pour ranger des éléments.
La géomètrie utilisée pour le rangement dépendra
du type de placement (Layout) associé.
-
JOptionPane
C'est le composant de base pour créer un dialogue.
-
JScrollPane
Permet l'utilisation d'un ou deux ascenceurs.
-
JSplitPane
Permet l'utilisation d'une (et une seule) barre de séparation.
-
JTabbedPane
Permet de disposer de plusieurs composants sur un même espace,
et de passer de l'un à l'autre grâce à des onglets.
-
JToolBar
C'est une barre d'outils, représentés graphiquement généralement
à l'aide de boutons.
-
JInternalFrame
Comme son nom l'indique, ce composant sert à créer des
frames "internes". Cela permet d'avoir un bureau à l'intérieur
d'une fenêtre.
-
JLayeredPane
Gère des composants en 2D1/2, c'est à dire avec une notion
de profondeur (depth). Ce composant intervient souvent de façon
cachée à travers d'autres composants.
Les composants de base seront les feuilles des arborescences de composants
(certains composants très spécialisés ne sont pas
présents dans cette liste)
Le programme suivant (voir exemple
d'utilisation) illuste l'utilisation de quelques composants et leurs
communications :
ColorItem.java,
JComponentsTable.java,
Resources.java.
Géométrie
Le choix de la taille de base d'un composant est souvent laissé
à la boîte à outil. Ainsi, la taille d'un bouton par
exemple dépendra initialement de la taille du texte qu'il contient.
Il est toutefois possible de préciser dans le programme un ensemble
de paramètres pour les tailles d'un composant aussi bien à
son initialisation que lors de ses déformations. Cela se fait en
utilisant les métodes de la classe JComponent
: setMinimumSize(Dimension), setMaximumSize(Dimension)
et setPreferredSize(Dimension).
Le principal outil pour la géométrie des interfaces graphiques
est l'utilisation de "positionnements" (layout). Dans Swing, les positionnements
sont gérés par des objets instances de classes ayant pour
terminaison Layout.
Les classes de gestionnaires de positionnement sont au nombre de 6.
Seule, BoxLayout est propre à Swing, les autres classes étant
déja présentes dans l'AWT.
-
java.awt.BorderLayout
Positionnement divisé en 5 zones : NORTH, SOUTH, EAST, WEST
et CENTER. Les deux zones NORTH et SOUTH occupent tout l'espace horizontal.
Lors d'une modification de la taille du composant contenant ce positionnement,
c'est la zone centrale qui est principalement redimensionnée. Si
le redimensionnement est vertical (resp. horizontal), les zones EAST et
WEST (resp. NORTH et SOUTH) sont également modifiées.
-
javax.swing.BoxLayout
Positionnement qui permet d'aligner des objets soit verticalement,
soit horizontalement. C'est une généralisation du FlowLayout.
Le type d'alignement est paramétrable (par rapport au centre ou
à l'un des bords, ...).
-
java.awt.CardLayout
Positionnement qui permet d'afficher plusieurs ensembles d'objets successivement
sur une même zone. Il est souvent préférable d'utiliser
un composant JTabbedPane.
-
java.awt.FlowLayout
Positionnement qui affiche les composants horizontalement, avec retour
à la ligne si nécessaire.
-
java.awt.GridLayout
Positionnement qui affiche les composants sur une grille. Il est possible
de préciser le nombre de lignes, de colonnes, ou les deux.
-
java.awt.GridBagLayout
Les programmes suivant illustrent l'utilisation de chacun de ces positionnements
: TestBorderLayout.java,
TestBoxLayout.java,
TestCardLayout.java,
TestFlowLayout.java,
TestGridLayout.java,
TestGridBagLayout.java.
Gestion des évènements
L'exemple présenté en début de
page, ainsi que celui montrant l'utilisation
de divers composants, illustrent l'utilisation des fonctions addXXXListener
qui permettent de relier à un composant un objet "observateur" de
ce composant chargé de réagir à certains évènements.
Ces évènements sont paramétrés par les conditions
dans lesqueslles ils ont eu lieu : coordonnées de la souris, caractère
associé à la touche activée, touches "modificatrices"
(Shift, Alt, Ctrl, ...) enfoncées ou non. L'exemple suivant montre
comment prendre en compte de tels paramètres. Il s'agit de dessiner
des traits dans une fenêtre. L'utilisation de la touche Majuscule
lors d'un clic engendrera l'utilisation d'une autre couleur pour tracer
les traits, celle du bouton de droite de la souris l'effacement des traits
présents : Trace.java.
Dessins en dimension 2
Java propose un ensemble de classes pour faciliter les dessins en dimension
2. Ces classes sont présentées dans un tutoriel 2D
Graphics.