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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

GridBagLayout "crop" mes composants


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Par défaut GridBagLayout "crop" mes composants
    Bonjour a tous,

    voici la situation

    J'ai un JPanel(new GridBagLayout());
    Je veux y inserer 5 images, 3 en haut et 2 en bas.
    Comme je souhaite harmoniser l'affichage ca donne ca pour les contraintes

    Image 0 gridx: 0 gridy: 0 gridwidth 2
    Image 1 gridx: 2 gridy: 0 gridwidth 2
    Image 2 gridx: 4 gridy: 0 gridwidth 2
    Image 3 gridx: 0 gridy: 1 gridwidth 3
    Image 4 gridx: 3 gridy: 1 gridwidth 3

    Comme vous le voyez dans la piece jointe, il semblerait qu'a part l'image 3. Toutes les images sont bien ancrees mais on peut voir que l'image 1 et 4 sont coupees.
    L'image 3 elle semble etre pousse a droite comme si il y avait un padding quelconque alors qu'il n'est pas sense en avoir :/

    J'ai a peu pres tout touche au niveau des contraintes, tenter de forcer la taille des 5 elements mais rien n'y fait.
    Est-ce une faiblesse du gridbaglayout parce que je joue trop avec les gridwidth et tout ?
    Je pose la question car dans les cas ou j'ai 3, 4 ou 6 images, tout va bien mais les gridwidth sont seulement 1 ou 2.

    Quelqu'un aurait une idee de quels pourraient etre les facteurs qui font que ca deconne?
    Images attachées Images attachées  

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    non ce n'est pas une limitation du gridbaglayout.
    Ceci dit, si je suis la logique, dans la colonne 2 vous avez 0 éléments, ce qui fait que cette colonne ne sert à rien. N'oubliez pas que le gridbaglayout calcule chaque colonne indépendament des aurtre et, pour la colonne 2, il ne dispose d'aucun élément pour faire son calcul, ce qui peut l'induire en erreur.

    J'ai plusieurs questions

    1- quelle est la nature des composants placé dans le grdibaglaytoi, comment calculent-ils leur prefferedSize, leur minimumSize et leur maximumSize
    2- Quelles autres contraintes éventuellements mises dans le GridBagConstraint (centrage, marges, etc)
    3- L'ensemble tailles des images + marge n'est-il pas supérieur à la taille maximum dont dispose le GridBaglayout (auquel cas, il devra sabrer dans le tas)

  3. #3
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Par défaut
    Puisque je definis le gridwidth pour que chaque element prenne le bon nombre de colonnes, je ne devrais pas avoir de colonne vide, non? Est-ce qu'il y a quelque chose que j'ai zappe?
    J'organise mes images comme suit, le numero indique leur gridwidth.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    +-----------------+
    |--2--|--2--|--2--|
    |----3---|----3---|
    +-----------------+
    1- J'insere des JPanel().
    J'ai override getMinimumSize et getMaximumSize pour retrouver getPreferedSize et j'ai defini la preferedSize en fonction du nombres d'images que je compte inserer. Sur la premiere ligne, chacun a le parentWidth / 3 et en dessous parentWidth / 2 et tous parentHeight / 2.

    2- Je ne touche que le gridx, gridy et gridwidth pour les contraintes.

    3- Je realise la meme operation pour 6 images par exemple, et l'affichage est parfait donc je ne suis pas sur que ce soit un probleme de dimension.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ce ne sont pas des colonnes vides mais des marges a mon avis.
    Citation Envoyé par oldergod Voir le message

    1- J'insere des JPanel().
    J'ai override getMinimumSize et getMaximumSize pour retrouver getPreferedSize et j'ai defini la preferedSize en fonction du nombres d'images que je compte inserer. Sur la premiere ligne, chacun a le parentWidth / 3 et en dessous parentWidth / 2 et tous parentHeight / 2.
    C'est une erreur, la taille du parent est calculée en fonction des enfants. La logique des layout c'est que

    1) les enfant ont un "range" de tailles acceptables (de minimum à maximum, en passant par le prefered
    2) le layout prend toutes ces données en compte et dispose les éléments
    3) en fonction de cette disposition, cela donne la valeur du minimum/max/preffered du parent
    4) le conteneur du parent en tiens compte pour faire son layout à lui.

    On le vois donc, les préférence de taille des enfants sont demandées avant de définir la taille du parent... Dans ton cas, il vaut mieux faire ceci, je pense

    1) même layout
    2) un "vrai" minimum, max, preffered (éventuellement le même pour tous les panneaux, ca dépend du but recherché)
    3) du fill à BOTH dans les contraintes
    4) en fonction de la taille qu'a obtenu ton panneau enfant, s'arranger pour y dessiner toute l'image.

    L'autre option c'est
    tailles du panneau = taille voulue du conteneur /2 ou /3
    un boxlayout vertical (pour faire les deux lignes)
    dans chaque sous panneau, un boxlayout horizontal ou un flowlayout (pour mettre les images côte à côte).

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ce ne sont pas des colonnes vides mais des marges a mon avis.

    C'est une erreur de dépendre de la taille du parent, la taille du parent est calculée en fonction des enfants. La logique des layout c'est que

    1) les enfant ont un "range" de tailles acceptables (de minimum à maximum, en passant par le prefered
    2) le layout prend toutes ces données en compte et dispose les éléments
    3) en fonction de cette disposition, cela donne la valeur du minimum/max/preffered du parent
    4) le conteneur du parent en tiens compte pour faire son layout à lui.

    On le vois donc, les préférence de taille des enfants sont demandées avant de définir la taille du parent... Dans ton cas, il vaut mieux faire ceci, je pense

    1) même layout
    2) un "vrai" minimum, max, preffered (éventuellement le même pour tous les panneaux, ca dépend du but recherché)
    3) du fill à BOTH dans les contraintes
    4) en fonction de la taille qu'a obtenu ton panneau enfant, s'arranger pour y dessiner toute l'image.

    L'autre option c'est
    tailles du panneau = taille voulue du conteneur /2 ou /3
    un boxlayout vertical (pour faire les deux lignes)
    dans chaque sous panneau, un boxlayout horizontal ou un flowlayout (pour mettre les images côte à côte).

    A noter que dans ton layout, la première et la dernière colonne sont inutiles, ceci aurait été équivalent:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    +-----------------+
    |--1--|--2--|--1--|
    |----2---|----2---|
    +-----------------+

  6. #6
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Par défaut
    Tu as dit plus haut que ce n'etait pas une limitation du gridBagLayout mais pourquoi ce code n'affiche-t-il pas ce qu'il devrait?

    Apres plusieurs tests, on dirait bien que ce layout ne veut pas creer des colonnes "coupees". Dans l'exemple, il ne veut pas que la "ligne" entre label 4 et 5 soit au milieu du 2.
    J'ai un code generique car je ne sais jamais combien d'images je compte afficher et ca m'embete de changer le layout vu que pour les autres nombres ca marche sans probleme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    import java.awt.Color;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
    public class TestClass {
     
        public static void main(String[] args) {
            try {
                new TestClass();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
        public TestClass() {
            JFrame frame = new JFrame();
     
            JPanel pnlContent = new JPanel(new GridBagLayout());
            pnlContent.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.fill = GridBagConstraints.BOTH;
            int index = 0;
            JLabel label = new JLabel("Label " + ++index);
            label.setBorder(BorderFactory.createLineBorder(Color.blue, 1));
            // label.setPreferredSize(new Dimension(200, 100));
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 1;
            pnlContent.add(label, gbc);
            label = new JLabel("Label " + ++index);
            label.setBorder(BorderFactory.createLineBorder(Color.blue, 1));
            // label.setPreferredSize(new Dimension(200, 100));
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
            pnlContent.add(label, gbc);
            label = new JLabel("Label " + ++index);
            label.setBorder(BorderFactory.createLineBorder(Color.blue, 1));
            // label.setPreferredSize(new Dimension(200, 100));
            gbc.gridx = 3;
            gbc.gridy = 0;
            gbc.gridwidth = 1;
            pnlContent.add(label, gbc);
            label = new JLabel("Label " + ++index);
            label.setBorder(BorderFactory.createLineBorder(Color.blue, 1));
            // label.setPreferredSize(new Dimension(300, 100));
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.gridwidth = 2;
            pnlContent.add(label, gbc);
            label = new JLabel("Label " + ++index);
            label.setBorder(BorderFactory.createLineBorder(Color.blue, 1));
            // label.setPreferredSize(new Dimension(300, 100));
            gbc.gridx = 2;
            gbc.gridy = 1;
            gbc.gridwidth = 2;
            pnlContent.add(label, gbc);
     
            frame.getContentPane().add(pnlContent);
     
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(610, 210);
            frame.setVisible(true);
        }
     
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL2k5][SSIS] Quotes générées dans mes variables dynamiques
    Par Ivynox dans le forum Développement
    Réponses: 0
    Dernier message: 09/08/2010, 10h45
  2. Probleme pour placer mes composants avec gridbaglayout
    Par Zoners dans le forum Débuter
    Réponses: 1
    Dernier message: 08/05/2010, 21h57
  3. [MySQL] Pourquoi dois-je utiliser des "quotes penchées" dans mes requêtes?
    Par v4np13 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/02/2008, 23h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo