La mise en page GridBagLayout est la plus complète. Comme GridLayout, elle est basée sur la définition de grilles. Mais contrairement à GridLayout, les composants n’ont pas forcément des dimensions identiques : ils peuvent occuper une ou plusieurs cases de la grille.
Le constructeur de la classe GridBagLayout ne comporte aucun argument :
public GridBagLayout();
L’objet GridBagConstraints
Pour pouvoir utiliser une mise en page GridBagLayout, vous devez définir un objet de classe GridBagContraints et initialiser une ou plusieurs de ses propriétés.
Les propriétés gridx et gridy
Les propriétés gridx et gridy définissent les coordonnées de la cellule dans la zone d’affichage.
public int gridx;
public int gridy;
A titre d’exemple, les propriétés gridx et gridy de la première cellule valent (respectivement) 0 et 0. Celles de la cellule à sa droite valent 1 et 0 et celles de la cellule qui la suit valent 0 et 1. Dans un GridBagLayout de 3×3 cellules de même taille, voici comment seraient repérées chacune de ces cellules :
Certaines cellules peuvent rester vides. Les valeurs de gridx et de gridy peuvent être spécifiées à l’aide d’entiers, comme dans le tableau précédent, mais vous pouvez également utiliser la constante GridBagConstraints.RELATIVE. Cette constante signifie que le composant sera placé dans la cellule de droite (gridx) ou dans la cellule en-dessous (gridy) du composant précédent.
Les propriétés gridwidth et gridheight
Les propriétés gridwidth et gridheight définissent respectivement le nombre de cases en colonnes et en lignes du composant courant. La valeur par défaut est 1 :
public int gridwidth;
public int gridheight;
Ces propriétés doivent avoir une valeur entière supérieure ou égale à 1.
Si vous le souhaitez, vous pouvez également leur affecter la constante GridBagConstraints.REMAINDER ou GridBagConstraints.RELATIVE :
- GridBagConstraints.REMAINDER indique que le composant est le dernier de sa ligne ou de sa colonne.
- GridBagConstraints.RELATIVE indique que le composant est l’avant-dernier de sa ligne ou de sa colonne. Il occupera toutes les cellules disponibles depuis sa position jusqu’à l’avant-dernière cellule.
La propriété anchor
La propriété anchor permet de définir le point d’ancrage d’un composant dans la ou les cellules qu’il occupe. Dans la copie d’écran suivante par exemple, le bouton B1 est ancré dans la partie supérieure de la cellule et le bouton B3 dans la partie inférieure de la cellule :
Il existe neuf points d’ancrage résumés dans ce tableau :
FIRST_LINE_START | PAGE_START | FIRST_LINE_END |
LINE_START | CENTER | LINE_END |
LAST_LINE_START | PAGE_END | LAST_LINE_END |
La propriété fill
La propriété fill détermine comment utiliser l’espace disponible lorsque la taille du composant est inférieure à celle qui lui est offerte :
public int fill;
La valeur par défaut de cette variable est GridBagConstraint.NONE.
Vous pouvez opter pour l’une des constantes suivantes :
- GrigBagConstraint.NONE pour ne pas redimensionner le composant.
- GrigBagConstraint.HORIZONTAL pour remplir l’espace horizontal offert.
- GrigBagConstraint.VERTICAL pour remplir l’espace vertical offert.
- GrigBagConstraint.BOTH pour remplir l’espace offert, horizontalement et verticalement.
Les propriétés weightx et weighty
Les propriétés weightx et weighty déterminent comment se répartit l’espace supplémentaire entre les composants :
public double weightx;
public double weighty;
La valeur par défaut des variables weightx et weighty est 0. Dans ce cas, les composants sont centrés horizontalement (weightx) et verticalement (weighty) dans l’espace qui leur est alloué. La somme des poids horizontaux d’une même ligne doit être 1. De même pour la somme des poids verticaux d’une même colonne.
Les propriétés ipadx et ipady
Les propriétés ipadx et ipady définissent les marges internes minimales du composant. La taille des composants est au moins égale à (largeur min + ipadx * 2) x (hauteur min + ipady * 2). La valeur par défaut de ces deux variables est 0.
public int ipadx;
public int ipady;
Pour avoir de plus amples renseignements sur les méthodes de la classe GridBagLayout, vous consulterez la documentation Oracle de l’API.
Quelques exemples
Trois boutons centrés sur une seule ligne :
JPanel container = new JPanel();
this.setTitle("Grid Bag Layout");
this.setSize(300, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
container.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
container.add(new JButton("Test"), c);
c.gridx = 1;
c.gridy = 0;
container.add(new JButton("de"), c);
c.gridx = 2;
c.gridy = 0;
container.add(new JButton("la"), c);
this.setContentPane(container);
this.setVisible(true);
Trois boutons sur une même ligne entièrement occupée. Le premier deux fois plus large que les deux autres.
…
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
container.add(new JButton("Test"), c);
c.gridx = 1;
c.gridy = 0;
c.weightx = 0.25;
container.add(new JButton("de"), c);
c.gridx = 2;
c.gridy = 0;
c.weightx = 0.25;
container.add(new JButton("la"), c);
…
Quatre boutons. Le premier occupe toute la largeur, les trois autres occupent tous l’espace vertical restant. La répartition horizontale des trois derniers boutons est 0,8 0,1 et 0,1.
…
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
c.gridwidth = 3;
c.weightx = 1;
c.weighty = 0;
container.add(new JButton("Super"), c);
c.gridx = 0;
c.gridy = 1;
c.fill = GridBagConstraints.BOTH;
c.gridwidth = 1;
c.weightx = 0.8;
c.weighty = 1;
container.add(new JButton("Test"), c);
c.gridx = 1;
c.gridy = 1;
c.weightx = 0.1;
container.add(new JButton("de"), c);
c.gridx = 2;
c.gridy = 1;
c.weightx = 0.1;
container.add(new JButton("la"), c);
…
Exercice
Ecrivez le code nécessaire pour obtenir cet affichage :
Solution
public Test4(){
JPanel container = new JPanel();
this.setTitle("Grid Bag Layout");
this.setSize(300, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
container.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
container.add(new JButton("1"), c);
c.gridx = 1;
c.gridy = 1;
container.add(new JButton("2"), c);
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 5;
container.add(new JButton("3"), c);
c.gridx = 3;
c.gridy = 3;
c.gridwidth = 1;
container.add(new JButton("4"), c);
c.gridx = 4;
c.gridy = 4;
container.add(new JButton("5"), c);
c.gridx = 0;
c.gridy = 4;
container.add(new JButton("6"), c);
c.gridx = 1;
c.gridy = 3;
container.add(new JButton("7"), c);
c.gridx = 3;
c.gridy = 1;
container.add(new JButton("8"), c);
c.gridx = 4;
c.gridy = 0;
container.add(new JButton("9"), c);
this.setContentPane(container);
this.setVisible(true);
}