OVH Cloud OVH Cloud

[SWING] Question de layout

8 réponses
Avatar
MiXAO
Je voudrais dans mon JPanel disposer verticalement de plusieurs composants :

un JButton de taille fixe,
un JCheckBox,
un JLabel,
etc..
Tout cela de taille fixe et qui ne bougent pas quand on retaille le JPanel.

Quel layout me permettrait de pouvoir faire ça ?
Je n'arrive pas à en trouver de correct. Parfois le layout m'impose meme
de donner la même hauteur à tous mes composants. :/

On m'a parler d'un AnchorLayout ou d'un absoluteLayout mais c'est pas
natif swing :/

merci d'avance

8 réponses

Avatar
Christophe M
MiXAO wrote:
Je voudrais dans mon JPanel disposer verticalement de plusieurs
composants :

un JButton de taille fixe,
un JCheckBox,
un JLabel,
etc..
Tout cela de taille fixe et qui ne bougent pas quand on retaille le JPanel.

Quel layout me permettrait de pouvoir faire ça ?
Je n'arrive pas à en trouver de correct. Parfois le layout m'impose meme
de donner la même hauteur à tous mes composants. :/

On m'a parler d'un AnchorLayout ou d'un absoluteLayout mais c'est pas
natif swing :/

merci d'avance


un simple : monpanel.setLayout(null);
te permettra de positionner tes composants via les setBounds() et setSize()

Avatar
Sebastien Annedouche
MiXAO wrote:
Je voudrais dans mon JPanel disposer verticalement de plusieurs
composants :

un JButton de taille fixe,
un JCheckBox,
un JLabel,
etc..
Tout cela de taille fixe et qui ne bougent pas quand on retaille le JPanel.

Quel layout me permettrait de pouvoir faire ça ?
Je n'arrive pas à en trouver de correct. Parfois le layout m'impose meme
de donner la même hauteur à tous mes composants. :/

On m'a parler d'un AnchorLayout ou d'un absoluteLayout mais c'est pas
natif swing :/

merci d'avance


Un GridBagLayout te permettra de faire tout ce que tu veux.

Sébastien

Avatar
Xavier
un simple : monpanel.setLayout(null);
te permettra de positionner tes composants via les setBounds() et
setSize()


Quelle horreur ! T'as fait du C ou du Visual Basic avant le Java ? Je trouve
les layout de Java très puissant, quel gachi de ne pas les utiliser !

Xavier

Avatar
Xavier
Salut,

Un GridBagLayout te permettra de faire tout ce que tu veux.


Effectivement, le GridBagLayout est le plus puissant, mais le plus
compliqué. Il faut bien le voir comme un tableau de cellule de largeurs et
hauteurs variable selon les beoins de chaque composant : la ligne prend au
moins la hauteur du composant le plus haut, pareil pour la largeur d'une
colonne. Commence par placer tes composants, en spécifiant, dans
GridBagConstraints, les gridx, gridy, gridwidth et gridheight, sans poids,
anchorÎNTER et fill=NON. Ensuite, ajuste les paramètres anchor (position
dans la cellule) et fill (remplissage de la cellule). Puis, si nécessaire,
met quelques poids. Je te conseille de ne pas jouer avec les ipadx et ipady
(laisse les à 0). Evite également les positionnements spéciaux, ceux à
partir de PAGE_START (= 19).

Pendant tes tests, pour bien voir où sont tes composants, et notamment la
taille qu'ils prennent, met-leur une bordure.

A+

Xavier

Avatar
Christophe M
Xavier wrote:
un simple : monpanel.setLayout(null);
te permettra de positionner tes composants via les setBounds() et


setSize()

Quelle horreur ! T'as fait du C ou du Visual Basic avant le Java ? Je trouve
les layout de Java très puissant, quel gachi de ne pas les utiliser !

Xavier




Oui, j'ai fait du VB, du C, du C#. ET OUI je sais que les layouts sont
très puissant. Mais le monsieur demandait une solution pour "Tout cela
de taille fixe et qui ne bougent pas quand on retaille le JPanel" ,
alors je lui donne la solution.

Et d'abord, les layouts sont là pour aider le programmeur qui veut des
composants qui s'adaptent automatiquement aux changement de taille du
conteneur. Comme ça, il doit pas se tapper à la main les calculs lors de
chaque "repaint".
Mais je ne trouve rien d'horrible à faire du positionnement/taillage
"précis", il y a d'ailleurs tout ce qu'il faut dans les classes de
swing. Evidemment si c'est pour se retapper l'event de paint sur la
frame, là ça devient stupide.
Et puis gérer les x/y et width/height sur les composants ça n'est pas
beaucoup plus horrible que les contraintes du GridBagLayout, voir les
"empillages" de Borderlayout et autres JPanel pour arriver à avoir le
rendu qui va bien.

Après tout le programmeur à le choix de l'utilisation des classes fournies.


Avatar
Christophe M
Xavier wrote:

Salut,


Un GridBagLayout te permettra de faire tout ce que tu veux.



Effectivement, le GridBagLayout est le plus puissant, mais le plus
compliqué. Il faut bien le voir comme un tableau de cellule de largeurs et
hauteurs variable selon les beoins de chaque composant : la ligne prend au
moins la hauteur du composant le plus haut, pareil pour la largeur d'une
colonne. Commence par placer tes composants, en spécifiant, dans
GridBagConstraints, les gridx, gridy, gridwidth et gridheight, sans poids,
anchorÎNTER et fill=NON. Ensuite, ajuste les paramètres anchor (position
dans la cellule) et fill (remplissage de la cellule). Puis, si nécessaire,
met quelques poids. Je te conseille de ne pas jouer avec les ipadx et ipady
(laisse les à 0). Evite également les positionnements spéciaux, ceux à
partir de PAGE_START (= 19).

Pendant tes tests, pour bien voir où sont tes composants, et notamment la
taille qu'ils prennent, met-leur une bordure.

A+

Xavier




Moi j'aime bien aussi le FormLayout sur http://www.jgoodies.com/index.html

ça ressemble au gridbag mais en un rien plus simple/compréhensbile à gérer.
A tester pour se faire une idée.


Avatar
Xavier
Salut Christophe,

OK, je comprends ta réponse. Les layouts sont pratiques pour un comportement
dynamique des composants sur changement de taille du conteneur, mais avant
cela, ils sont pratiques juste pour le placement des composants, sans avoir
à calculer les positions x et y de chaque.

En plus, il est très courant de voir un novice en Java qui essaie de
contourner les layouts après quelques essais infructueux (je ne dis pas ça
forcément pour MIXAO, j'en sais rien). Rien de tel qu'un petit exercice de
base pour les prendre en main, on y gagne après.

Xavier


"Christophe M" <mccricri_at_hotmail.com> a écrit dans le message de
news:413c723d$
Xavier wrote:
un simple : monpanel.setLayout(null);
te permettra de positionner tes composants via les setBounds() et


setSize()

Quelle horreur ! T'as fait du C ou du Visual Basic avant le Java ? Je
trouve


les layout de Java très puissant, quel gachi de ne pas les utiliser !

Xavier




Oui, j'ai fait du VB, du C, du C#. ET OUI je sais que les layouts sont
très puissant. Mais le monsieur demandait une solution pour "Tout cela
de taille fixe et qui ne bougent pas quand on retaille le JPanel" ,
alors je lui donne la solution.

Et d'abord, les layouts sont là pour aider le programmeur qui veut des
composants qui s'adaptent automatiquement aux changement de taille du
conteneur. Comme ça, il doit pas se tapper à la main les calculs lors de
chaque "repaint".
Mais je ne trouve rien d'horrible à faire du positionnement/taillage
"précis", il y a d'ailleurs tout ce qu'il faut dans les classes de
swing. Evidemment si c'est pour se retapper l'event de paint sur la
frame, là ça devient stupide.
Et puis gérer les x/y et width/height sur les composants ça n'est pas
beaucoup plus horrible que les contraintes du GridBagLayout, voir les
"empillages" de Borderlayout et autres JPanel pour arriver à avoir le
rendu qui va bien.

Après tout le programmeur à le choix de l'utilisation des classes
fournies.




Avatar
MiXAO
MiXAO wrote:
Je voudrais dans mon JPanel disposer verticalement de plusieurs
composants :

un JButton de taille fixe,
un JCheckBox,
un JLabel,
etc..
Tout cela de taille fixe et qui ne bougent pas quand on retaille le JPanel.

Quel layout me permettrait de pouvoir faire ça ?
Je n'arrive pas à en trouver de correct. Parfois le layout m'impose meme
de donner la même hauteur à tous mes composants. :/

On m'a parler d'un AnchorLayout ou d'un absoluteLayout mais c'est pas
natif swing :/

merci d'avance


Merci à tout le monde pour les conseils.
J'avais commencé à utiliser le GridBagLayout et je le trouvais un peu
difficile à appréhender, mais visiblement, c'est une des meilleures
pistes et je vais donc persévérer.
En fait, c'est vrai que c'est une question de conception avant tout.
Si je peux me passer du positionnement au pixel prés, c'est parfait, ça
me semble plus propre.
Je viens de Delphi ou il n'y a pas de Layout mais où la conception ne
marche que de cette manière (bon, y'a quand même des Anchors et d'autres
choses encore mais bon) et donc je suis un peu perdu pour retrouver mes
repères, comme faire une boite d'options avec donc une check box, un
bouton en dessous, eventuellement des Radio Bouttons dans un group box,
etc...

MiXAO