OVH Cloud OVH Cloud

GridBagLayout

9 réponses
Avatar
Pif
Bonjour, j'ai un ptit soucis et j'ai pas trop l'habitude des astuces de
layout :

Mon interface se construit récursivement et possède un nombre non fixe
de composants graphiques qui s'auto-composent et ne sont pas décrit de
façon centralisée dans mon interface. Du coup, j'obtiens une image telle
que :

http://www.lgi2p.ema.fr/~jalabert/download/nouveau-2.jpg

Chaque ligne est un component avec son propre gridbagLayout. Le paneau
principal est un YBox.

Ce que je voudrais c'est pouvoir aligner la séparation entre le type
(gène, cluster, etc. ) et les cases a cocher ...

Dans l'idéal, j'aimerais que la fenetre trouve toute seule à
l'initialisaion la taille optimale pour ne pas avoir des dépassement des
deux cotés... elle s'aligne en fonction du plus long label à gauche, le
nombre de cases à cocher étant borné à 4, la partie droite est plus
facile à prévoir !

Merci pour le coup de main.

9 réponses

Avatar
ekse
Bonjour, j'ai un ptit soucis et j'ai pas trop l'habitude des astuces de
layout :

Mon interface se construit récursivement et possède un nombre non fixe
de composants graphiques qui s'auto-composent et ne sont pas décrit de
façon centralisée dans mon interface. Du coup, j'obtiens une image telle
que :

http://www.lgi2p.ema.fr/~jalabert/download/nouveau-2.jpg

Chaque ligne est un component avec son propre gridbagLayout. Le paneau
principal est un YBox.

Ce que je voudrais c'est pouvoir aligner la séparation entre le type
(gène, cluster, etc. ) et les cases a cocher ...

Dans l'idéal, j'aimerais que la fenetre trouve toute seule à
l'initialisaion la taille optimale pour ne pas avoir des dépassement des
deux cotés... elle s'aligne en fonction du plus long label à gauche, le
nombre de cases à cocher étant borné à 4, la partie droite est plus
facile à prévoir !

Merci pour le coup de main.


Salut,

Pour l'alignement, ce n'est pas difficile, tu as deux solutions :
- Soit tu forces la taille de chaque label pour quelle soit celle du
plus grand label (mauvaise solution)
- Soit tu utilises un et un seul Component permettant ainsi d'avoir un
seul GridBagLayout et donc un alignement naturel. (à priori la bonne
solution).

Probleme : Est-ce que ton processus de construction te permet de placer
un GridBagLayout à ce niveau ?

Avatar
Pif
non justement, mon processur qui s'intègre bien dans mon architecture
est récursif, chacun file un panel à un composant de plus haut niveau

du coup, je ne peux pas créer un grid bag pour tout, mais plusieurs
gridbag déconnectés

du coup, l'idéal pour moi serait de pouvoir spécifier pour 1 cas à
cocher une largeur de 60 et pour 4 cases une largeur de 15, c'est de la
bidouille, mais du coup j'aurais un alignement par la droite ...
mais ca j'ai pas trouvé ...


Probleme : Est-ce que ton processus de construction te permet de placer
un GridBagLayout à ce niveau ?


Avatar
ekse
non justement, mon processur qui s'intègre bien dans mon architecture
est récursif, chacun file un panel à un composant de plus haut niveau

du coup, je ne peux pas créer un grid bag pour tout, mais plusieurs
gridbag déconnectés

du coup, l'idéal pour moi serait de pouvoir spécifier pour 1 cas à
cocher une largeur de 60 et pour 4 cases une largeur de 15, c'est de la
bidouille, mais du coup j'aurais un alignement par la droite ...
mais ca j'ai pas trouvé ...


Probleme : Est-ce que ton processus de construction te permet de
placer un GridBagLayout à ce niveau ?



Ne peux-tu pas distinguer les panneaux des éléments définissant des
valeurs ? N'as-tu pas 2 types de panneaux ? ceux qui contiennent
d'autres panneaux et ceux qui définissent des cases à cocher (par exemple) ?


Avatar
Hervé AGNOUX
Pif wrote:


Dans l'idéal, j'aimerais que la fenetre trouve toute seule à
l'initialisaion la taille optimale pour ne pas avoir des dépassement des
deux cotés... elle s'aligne en fonction du plus long label à gauche, le
nombre de cases à cocher étant borné à 4, la partie droite est plus
facile à prévoir !



Il se peut que le javax.swing.SpringLayout soit mieux adapté à ton souci.
Avec ce layout Sun est parvenu à faire un dispositif encore plus prise de
tête que le GridBagLayout, mais il est bien adapté aux formulaires et à
tous les cas où la GUI est construite automatiquement.

Le principe général est assez simple à comprendre, mais la mise en oeuvre
Sun est non-intuitive au possible. Néanmoins cela te conduit à un code
relativement clair et maniable, dès l'instant que l'on en admet la lourdeur
(situation relativement courante avec Java, donc...).

A+.


--
Hervé AGNOUX
http://www.diaam-informatique.com

Avatar
Silicon
J'ai fait récemment le même genre de manip avec un panel qui contient
une liste de sous-panel.
Chaquue sous-panel est constitué d'un JLabel et d'une JComboBox.
Les sous-panels ont chacun un GridBagLayout avec:
- dans la 1ere colonne, le JLabel dont la preferredSize est
déterminée en fonction du texte
- dans la 2e colonne, la JComboBox dont la preferredSize est
déterminée par le plus grand des items à afficher.

Ensuite, lors de l'ajout des sous-panels au panel contenant, je
détermine la largeur la plus grande des labels et je refait une boucle
pour réaffecter cette Dimension à tous les labels.
Cela suppose d'avoir un accesseur sur les JLabels des sous-panels.

<code>
int maxWidth = 0; // largeur la plus grande des labels
for (SousPanel ssPnl : ssPnlLst) { // ssPnlLst : la liste des
sous-panels
panel.add(ssPnl);
maxWidth = Math.max(maxWidth,
ssPnl.getLabel().getPreferredSize().width);
}

for (SousPanel ssPnl : ssPnlLst) { // ssPnlLst : la liste des
sous-panels
ssPnl.getLabel().setPreferredSize(new Dimension(maxWidth,
ssPnl.getLabel.getPreferredSize().height));
}
</code>

En espérant que cela t'aidera.
Avatar
Silicon
Petite précision, pour obtenir la longueur du texte dans le JLabel:

<code>
FontMetrics fm = monLabel.getFontMetrics(monLabel.getFont());

int longueurTexte = fm.stringWidth(monLabel.getText());
</code>
Avatar
Pif
merci , je vais essayer de me débrouiller avec tout ca, mais ce que je
comprends pas trop bien, je crois c'est le déroulement exacte de l'IHM...

comment son calculés les layout, quel est la différence exacte entre
size et prefered size, quelle différence entre pack et repaint ...

merci.
Avatar
Silicon
size est la taille du component
preferredSize est la taille préférée du composant .... En fait,
c'est celle qui est utilisée pour calculer la disposition (layout) des
composants.

pack (issu de la classe Window) indique au composant qui hérite de
Window (un JFrame par exemple) de déterminer sa taille afin de
correspondre au mieux aux preferredSize des component qu'il contient
(tient, preferredSize ;))

enfin, repaint demande au component de se redessiner.

Ce ne sont là que des traductions (approximatives) de la javaDoc de
l'API JAVA1.5.
Tu devrais y jetter un oeil. On n'y trouve pas tout mais ca peut
répondre à pas d'intérrogations quand même.
Avatar
Simon OUALID
Pif wrote:

comment son calculés les layout, quel est la différence exacte entre
size et prefered size,


Sur le doLayout(), lui même appelé sur le validate() d'un container,
après ça dépend des layouts : ceux qui modifient la taille des
composants qu'ils contiennent (comme le border, ou le grid), et les
autres (plus rares, comme le flow, le card ou quelques autres) !

La size est la taille *courante* du composant, la preferredSize est sa
taille *préférée*.

Cette dernière est utilisée par certains LayoutManager pour déterminer
la position et la taille des composants contenus dans le container
qu'ils managent.

Par exemple, Le FlowLayout affiche tous les composants du container
qu'il manage à leurs tailles préférés, et défini ensuite la taille
préférée de son container ...

Le BorderLayout, lui, si on prend les zones sud et nord en exemple, se
servira uniquement de la preferredSize().height maximale du container
situé dans ces zones pour déterminer la taille de ces dernières (elle
même déterminée par le LayoutManager *propre* à ce container). C'est
récursif, quoi.

quelle différence entre pack et repaint ...


Pack essaie de réduire au maximum une fenêtre sans descendre en dessous
des preferred size des composants/layouts qui la compose), puis valide
le layout.

Repaint repasse juste un coup de peinture sur tous les composants.

C'est vrai que c'est un peu le bordel ces histoires de layouts et qu'on
se pomme vite (j'espère d'ailleurs ne pas avoir dit trop de conneries),
mais quand on a capté deux ou trois principes, on arrive à faire de très
belles IHM, resizable et internationalisable et faciles à faire évoluer
(non non, je nage pas en plein rêve).

Marrant à ce sujet : http://madbean.com/anim/totallygridbag

Symon
www.oualid.net