L'instance de la classe GridBagLayout représente le gestionnaire de placement le plus complexe et le plus flexible de la plateforme Java.

L'objet GridBagLayout aligne les composants en les plaçant dans une grille composée de colonnes et de lignes. Chaque cellule peut contenir un à plusieurs composants. D'autre part, contrairement à l'objet GridLayout, il est possible que les composants soient placés sur une ou plusieurs cellules. De même, les lignes et les colonnes dans la grille ne sont pas nécessairement toutes de la même hauteur et de la même largeur.

La gestion du placement des composants nécessitent l'instanciation de la classe GridBagConstraints chargée d'exposer les contraintes de positionnement.

Container contentPane = getContentPane();
GridBagLayout grille = new GridBagLayout();
GridBagConstraints contraintes = new GridBagConstraints();
contentPane.setLayout(grille);

Chaque composant est placé dans une ou plusieurs cellules dont les caractéristiques doivent être fournies à un objet GridBagConstraints. Ce dernier contient un certain nombre de champs qui permettront au gestionnaire de placement de positionner précisément chaque composant.

// Instanciation du composant
ClasseGraphique obj = new ClasseGraphique();
// Définition des contraintes
contraintes.champs = valeur;
...
// Application des contraintes
grille.setConstraints(obj, contraintes);
// Ajout de l'objet dans le panneau de contenu
panneauContenu.add(obj);

Il est important de noter que ce processus doit être répété pour chaque composant à ajouter dans un panneau de contenu géré par le gestionnaire de placement GridBagLayout, et que les champs de l'objet GridBagConstraints doivent être réinitialisés pour chacun des objets graphiques, puisqu'en général une seule instance de la classe GridBagConstraints est employée pour l'ensemble de ces objets.

Le champs fill est utilisé pour la gestion du remplissage de la zone d'affichage du composant lorsque celui-ci possède une taille inférieure à l'espace disponible.

contraintes.fill = GridBagConstraints.CONSTANTE;
NONE : ne fournit aucune contrainte de taille (valeur par défaut).
HORIZONTAL : redimensionne horizontalement le composant afin de totalement remplir la zone d'affichage horizontale.
VERTICAL : redimensionne verticalement le composant afin de totalement remplir la zone d'affichage verticale.
BOTH : redimensionne horizontalement et verticalement le composant afin de totalement remplir la zone d'affichage.

L'ajout d'un composant dans ce gestionnaire de placement demande d'indiquer dans quelle cellule devra s'afficher le composant. L'objet GridBagConstraints dispose de deux champs gridx et gridy spécifiant les coordonnées de la cellule devant contenir le composant.

JButton bouton = new JButton("Un bouton");
contraintes.gridx = 0;
contraintes.gridy = 0;
grille.setConstraints(bouton, contraintes);
panneauContenu.add(bouton);

Il est également possible de spécifier une zone d'affichage comprenant plusieurs cellules. Un composant peut être placé sur des cellules alignées horizontalement ou verticalement par l'intermédiaire des champs gridheight et gridwidth.

JTextArea zoneTextuelle = new JTextArea("Une zone de texte");
// Spécification du nombre de cellules verticales 
// sur lesquelles s'afficheront le composant.
contraintes.gridwidth = 3;
// Spécification du nombre de cellules horizontales 
// sur lesquelles s'afficheront le composant.
contraintes.gridheight = 5;
// Affichage du composant sur la première colonne et la seconde ligne.
contraintes.gridx = 0;
contraintes.gridy = 1;
grille.setConstraints(zoneTextuelle, contraintes);
panneauContenu.add(zoneTextuelle);

Les espaces de remplissage au sein des composants peuvent être founis par l'intermédiaire des champs ipadx et ipady spécifiant respectivement des marges horizontales et verticales.

JButton bouton = new JButton("Soumettre");
contraintes.gridx = 1;
contraintes.gridy = 5;
// Spécifications de marges horizontales 
// de 10 pixels et verticales de 8 pixels.
contraintes.ipadx = 10;
contraintes.ipady = 8;
grille.setConstraints(bouton, contraintes);
panneauContenu.add(bouton);

Les espaces entre les composants sont définis par le biais d'un champs insets contenant un objet de type Insets, auquel sont passées quatre valeurs entières représentant les espaces supérieurs, inférieurs, droites et gauches.

constraintes.insets = 
      new Insets(valSup, valGau, valInf, valInf);

Les champs weightx et weighty permettent respectivement une redistribution des espaces libres horizontaux et verticaux entre les composants.

contraintes.weightx = 10;
contraintes.weighty = 12;

Le champs anchor fournit la position du composant au sein de sa zone d'affichage dans le panneau de contenu.

contraintes.anchor = GridBagConstraints.SOUTH;

Les valeurs possibles pour ce champs se décomposent en deux catégories.

les valeurs relatives : CENTER (valeur par défaut), NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST et NORTHWEST
les valeurs absolues : PAGE_START, PAGE_END, LINE_START, LINE_END, FIRST_LINE_START, FIRST_LINE_END, LAST_LINE_START et LAST_LINE_END

La classe GridBagLayout possède deux constructeurs. Le premier ne contient aucun argument et le second demande de fournir toutes les valeurs explicitées précédemment à appliquer par défaut aux composants à ajouter dans le conteneur.

GridBagConstraints GBC = 
                  new GridBagConstraints(val_gridx,
                                            val_gridy,
                                            val_gridwidth,
                                            val_gridheight,
                                            val_weightx,
                                            val_weighty,
                                            val_anchor,
                                            val_fill,
                                            obj_insets,
                                            val_ipadx,
                                            val_ipady);
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GrilleComplexe extends JFrame {
    public GrilleComplexe() {
        super("Démonstration GridBagLayout");

        this.creerInterface();

        super.pack();
        super.setVisible(true);
    }
    public void creerInterface() {
        JPanel pan = (JPanel)this.getContentPane();
        JTextField texte = new JTextField("Centre");
        texte.setPreferredSize(new Dimension(120, 120));
        JButton btnNord = new JButton("Nord");
        JButton btnEst = new JButton("Est");
        JButton btnSud = new JButton("Sud");
        JButton btnOuest = new JButton("Ouest");
        
        GridBagConstraints contraintes = new GridBagConstraints();
        GridBagLayout gestionnaire = new GridBagLayout();
        pan.setLayout(gestionnaire);
        
        contraintes.gridx = 0;
        contraintes.gridy = 0;
        contraintes.gridheight = 1;
        contraintes.gridwidth = 3;
        contraintes.weightx = 0;
        contraintes.weighty = 0;
        contraintes.fill = GridBagConstraints.HORIZONTAL;
        gestionnaire.setConstraints(btnNord, contraintes);
        pan.add(btnNord);
       
        contraintes.gridx = 0;
        contraintes.gridy = 1;
        contraintes.gridheight = 1;
        contraintes.gridwidth = 1;
        contraintes.weightx = 0;
        contraintes.weighty = 0;
        contraintes.fill = GridBagConstraints.VERTICAL;
        gestionnaire.setConstraints(btnOuest, contraintes);
        pan.add(btnOuest);

        contraintes.gridx = 1;
        contraintes.gridy = 1;
        contraintes.gridheight = 1;
        contraintes.gridwidth = 1;
        contraintes.weightx = 1;
        contraintes.weighty = 1;
        gestionnaire.setConstraints(texte, contraintes);
        pan.add(texte);

        contraintes.gridx = 2;
        contraintes.gridy = 1;
        contraintes.gridheight = 1;
        contraintes.gridwidth = 1;
        contraintes.weightx = 0;
        contraintes.weighty = 0;
        contraintes.fill = GridBagConstraints.VERTICAL;
        gestionnaire.setConstraints(btnEst, contraintes);
        pan.add(btnEst);

        contraintes.gridx = 0;
        contraintes.gridy = 2;
        contraintes.gridheight = 1;
        contraintes.gridwidth = 3;
        contraintes.weightx = 0;
        contraintes.weighty = 0;
        contraintes.fill = GridBagConstraints.HORIZONTAL;
        gestionnaire.setConstraints(btnSud, contraintes);
        pan.add(btnSud);
    }
    public static void main(String[] args) {
        GrilleComplexe boite = new GrilleComplexe();
    }
}