IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Le GridBagLayout expliqué


précédentsommairesuivant

4. Quelques problèmes courants.

4-1. Problème numéro 1: Oubli de spécifier des poids.

J'ai développé toute mon interface mais mes composants restent centrés dans ma fenêtre.
Vous avez probablement oublié de définir les poids weightx et weighty. En effet, voyons en images le problème (fenêtre new bookmark dans firefox).

Lorsque nous redimensionnons cette fenêtre, nous pouvons voir que tous les composants restent centrés. Cela est dû au fait que nous n'avons spécifié aucune contrainte de poids pour distribuer l'espace supplémentaire du container parmi les composants.

Image non disponible

Voila comment, dans cet exemple, nous allons distribuer l'espace supplémentaire. Tous les champs seront étalés sur toute la largeur du container (nous laisserons tout de même une petite marge à droite). La zone description elle sera étendue aussi bien horizontalement que verticalement. C'est cette zone qui se chargera de récupérer l'espace supplémentaire du container. Sa contrainte devra donc avoir des poids weightx et weighty de 1 et un fill sur BOTH. Les boutons quant à eux seront alignés à droite et ne seront pas redimensionnés. Appliquons ces modifications à notre code et observons le résultat.

Image non disponible

4-2. Problème numéro 2: Oubli de spécifier les tailles préférées et minimales.

J'essaye d'utiliser le GridBagLayout et voici à quoi ressemble mon interface :

Image non disponible

Quel est le problème et comment m'en sortir ?

Le problème est assez simple à comprendre. Par défaut, les tailles préférées (et minimums) des zones de saisies (JTextField) sont nulles. Donc, lorsqu'elles sont ajoutées à un container utilisant un GridBagLayout, si nous n'avons pas spécifié de tailles nous-mêmes, vous aurez le résultat présenté sur l'image précédente. Le problème est identique pour la zone description.
Pour résoudre le problème, nous pouvons soit spécifier des tailles minimales et préférées sur chacun de nos composants, soit définir une politique de redimensionnement (propriétés fill, weightx et weighty d'un objet GridBagConstraints). C'est-à-dire permettre aux composants de s'étendre sur l'espace qu'il leur est possible. Cette seconde solution est préférable à la première car elle s'adapte lorsque la taille du container est modifiée. C'est celle que nous avons implémentée ici.

Image non disponible

4-3. Problème numéro 3: Un gestionnaire de placement vertical.

Comment je peux faire pour aligner mes composants verticalement ? Je ne trouve pas de gestionnaire de placement qui me permette d'aligner des composants en colonne. Est-ce possible avec un GridBagLayout ?

Tout d'abord, il faut savoir que plusieurs gestionnaires de placements permettent d'aligner des composants en colonne (BoxLayout, SpringLayout). Mais il est également possible d'utiliser un GridBagLayout. Nous allons voir ici comment utiliser le GridBagLayout à cette fin, mais nous ne comparerons pas avec d'autres gestionnaires de placements.

Prenons un exemple de code

 
Sélectionnez
/* 2- Création et initialisation d'une série de composants. */
        String sentence = "Le GridBagLayout est un gestionnaire de placement";
        String[] words = sentence.split(" ");
        JButton[] buttons = new JButton[words.length];
        for (int i = 0; i < words.length; i++) {
            buttons[i] = new JButton(words[i]);
        }


        /*3- Ajout de ces composants en spécifiant les contraintes de type GridBagConstraints. */
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = GridBagConstraints.RELATIVE;

        for (JButton button : buttons) {
            mainFrame.add(button, gbc);
        }

Dans ce code, nous avons fixé la position gridx en 0 et comme nous avons spécifié un gridy sur GridBagConstraint.RELATIVE, à chaque ajout de composant, la position gridy sera incrémentée de 1 par rapport à la valeur précédente. Lorsque nous exécutons ce code, le résultat que nous aurons sera celui-ci :

Image non disponible

Nous pouvons déjà y voir une colonne de boutons. Voyons maintenant comment nous pouvons remanier cette colonne pour correspondre à nos besoins. N'ayant pas de besoins particuliers, nous allons voir une série d'exemples courants.

Premièrement, pour agrandir l'ensemble des composants à la taille préférée du plus grand, nous pouvons modifier notre contrainte en spécifiant une propriété fill de GridBagConstraint.HORIZONTAL.

Image non disponible

Deuxièmement, nous pouvons aussi mettre un poids (weightx de 1.) pour que ces composants s'étalent sur toute la largeur du container.

Image non disponible

Troisièmement, nous pouvons distribuer l'espace supplémentaire verticalement parmi les composants soit de manière équitable (image suivante), soit de manière inégale.

Image non disponible Image non disponible

Voila, nous avons rapidement fait une colonne de boutons et présenté quelques cas différents en modifiant la contrainte. Le GridBagLayout n'est pas limité qu'à ces cas. Sachez qu'il est également possible de jouer sur la taille des composants, de spécifier des marges, de définir ou non un redimensionnement... Nous vous invitons donc à lire le début du tutoriel.


précédentsommairesuivant

Copyright © 2010 bbclone. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.