Utiliser un gestionnaire de répartition GridBagLayout                        

Utiliser un gestionnaire de répartition GridBagLayout

     

Un gestionnaire de répartition de type java.awt.GridBagLayout est plus compliqué que ceux que nous avons vu jusqu'à présent, mais peu donner plus de souplesse. Néanmoins, il n'est pas facile à utiliser et demande de l'habitude. On déconseille son utilisation sauf si vraiment on ne trouve pas une autre façon de faire

Le principe est d'utiliser une grille virtuelle et de définir pour chaque sous-composant graphique un ensemble de paramètres qui permet de le positionner et de le dimensionner par rapport à la grille virtuelle et par rapport aussi aux autres sous-composants. Pour regrouper l'ensemble des composants, on utilise une instance de java.awt.GridBagConstraints.
C'est comme si, pour chaque sous-composant :

Les attributs de la classe GridBagLayout sont :

Enfin, il faut savoir que les contraintes liées à un sous-composant sont attachées à celui-ci et non pas contenues dans le gestionnaire de répartition. Cela entraîne par exemple qu'un même gestionnaire peut servir pour placer des sous-composants dans différents composants.

Voici le code d'une application faisant surgir une fenêtre dont l'intérieur correspond à ce que l'on voit ci-dessus.

Voici une image de l'interface graphique construite ci-dessous. Les composants en sont les mêmes que sur l'exemple de la page précédente consacrée au "GridLayout". Aucun événement n'est intercepté ; on peut juste écrire dans le JTextArea.

Ci-dessous, on a dessiné la grille fictive superposée à la fenêtre de l'application.

Ci-dessous le code de l'application. Nous avons reporté trois fois l'image de l'application dans le code pour que vous puissiez vous repérer.


import java.awt.Color;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Grille extends JFrame {
  JButton efface = new JButton("efface");
  JButton demarre = new JButton("demarre");
  JCheckBox relief = new JCheckBox("relief");
  JCheckBox  gras = new JCheckBox("gras");
  JTextArea texte = new JTextArea();
  JPanel dessin = new JPanel();

  publicnew GridBagLayout();
    GridBagConstraints contraintes;
    Container interieur = getContentPane();

    interieur.setLayout(repartiteur); 

    
// pour la zone bleue en haut à gauche // on cree "une fiche technique" contraintes = new GridBagConstraints(); // on remplit la "fiche technique" contraintes.gridx = 0; contraintes.gridy = 0; contraintes.gridwidth = 2; contraintes.gridheight = 2; contraintes.fill = GridBagConstraints.BOTH; contraintes.weightx = 1; contraintes.weighty = 1; // on attache la "fiche technique" au sous-composant repartiteur.setConstraints(dessin, contraintes); // on ajoute le sous-composant au compoant interieur.add(dessin); dessin.setBackground(Color.blue); //pour le bouton "efface" contraintes = new GridBagConstraints(); contraintes.gridx = 2; contraintes.gridy = 0; contraintes.anchor = GridBagConstraints.SOUTH; contraintes.insets = new Insets(10, 10, 10, 10); contraintes.ipady = 20; repartiteur.setConstraints(efface, contraintes); interieur.add(efface);
//pour le bouton "demarre" contraintes = new GridBagConstraints(); contraintes.gridx = 2; contraintes.gridy = 1; contraintes.gridwidth = 1; contraintes.gridheight = 1; contraintes.anchor = GridBagConstraints.NORTH; contraintes.insets = new Insets(10, 10, 10, 10); repartiteur.setConstraints(demarre, contraintes); interieur.add(demarre); //pour le bouton à cocher "relief" contraintes = new GridBagConstraints(); contraintes.gridx = 0; contraintes.gridy = 2; contraintes.ipady = 20; repartiteur.setConstraints(relief, contraintes); interieur.add(relief);
//pour le bouton à cocher "gras" contraintes = new GridBagConstraints(); contraintes.gridx = 0; contraintes.gridy = 3; repartiteur.setConstraints(gras, contraintes); interieur.add(gras); //pour le texte en bas à droite contraintes = new GridBagConstraints(); contraintes.gridx = 1; contraintes.gridy = 2; contraintes.gridwidth = 2; contraintes.gridheight = 2; contraintes.fill = GridBagConstraints.BOTH; contraintes.weightx = 1; contraintes.weighty = 1; repartiteur.setConstraints(texte, contraintes); interieur.add(texte); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 300); setVisible(true); } } class EssaiGrille { public static void main(String[] arg) { new Grille(); } }

Vous pouvez voir le code en java de l'application


© Irène Charon, Télécom ParisTech 2011