OVH Cloud OVH Cloud

Problème de Layout

8 réponses
Avatar
phep
Bonjour,

Je démarre avec Swing et je m'arrache les cheveux depuis un bon moment
sur un problème certainement très bête en faisant des tests pour bien
comprendre les techniques de positionnement.

Soit une appli très basique avec une JFrame à la base, je souhaiterai
que cette JFrame contienne un JPanel, centré verticalement et
hrorizontalement au milieu d'elle de telle manière que si la JFrame a un
fond bleu on voie le contenu du JPanel entouré de bandes bleues.
Idéalement, le JPanel pourrait se redimensionner (en + ou en-) en
fonction de la taille de son contenu.

Au mieux, avec un BoxLayout appliqué sur la JFrame, je réussis à centrer
horizontalement mais le JPanel reste "collé au plafond". J'ai testé
aussi un BorderLayout avec le constructeur permettant de spécifier les
hgap et vgap mais sans plus de succès, itou avec le GridLayout. Un
FlowLayout ne m'aide pas pour l'alignement vertical...

La seule méthode que je n'ai pas encore testée c'est le positionnement
absolu en calculant ou vérifiant toutes les tailles parce que je me dis
qu'il doit bien y avoir un moyen mon char à boeuf de faire ça, non ?

L'ami google ne m'a pas dit grand chose...

Merci d'avance pour toute piste,

phep

8 réponses

Avatar
Gaetan Zoritchak
phep wrote:
Bonjour,

Je démarre avec Swing et je m'arrache les cheveux depuis un bon moment
sur un problème certainement très bête en faisant des tests pour bien
comprendre les techniques de positionnement.

Soit une appli très basique avec une JFrame à la base, je souhaiterai
que cette JFrame contienne un JPanel, centré verticalement et
hrorizontalement au milieu d'elle de telle manière que si la JFrame a un
fond bleu on voie le contenu du JPanel entouré de bandes bleues.
Idéalement, le JPanel pourrait se redimensionner (en + ou en-) en
fonction de la taille de son contenu.

Au mieux, avec un BoxLayout appliqué sur la JFrame, je réussis à centrer
horizontalement mais le JPanel reste "collé au plafond". J'ai testé
aussi un BorderLayout avec le constructeur permettant de spécifier les
hgap et vgap mais sans plus de succès, itou avec le GridLayout. Un
FlowLayout ne m'aide pas pour l'alignement vertical...

La seule méthode que je n'ai pas encore testée c'est le positionnement
absolu en calculant ou vérifiant toutes les tailles parce que je me dis
qu'il doit bien y avoir un moyen mon char à boeuf de faire ça, non ?

L'ami google ne m'a pas dit grand chose...

Merci d'avance pour toute piste,

phep
Tu peux positionner ton panel grâce à une implémentation LayoutManager


genre :

public void layoutContainer(Container parent){
Component panel = parent.getComponents()[0];
int width = panel.getPreferredSize().width();
//Calcul de x,y en fonction du parent
...
panel.setBounds(x,y, width, height);
}

Autrement utilise le FormLayout de jgoodies
http://www.jgoodies.com/freeware/forms/ et définis un formulaire avec 3
lignes et 3 colonnes de la façon suivante:

FormLayout layout = new FormLayout(
“0:grow, pref,0:grow”,
“0:grow, pref,0:grow””);
}

puis ajoute ton panel sur la 2ème ligne, 2ème colonne.



--
Gaetan Zoritchak
Gestion de bug en mode ASP sous java
http://eap.bug-sweeper.fr

Avatar
phep
Gaetan Zoritchak wrote:
Tu peux positionner ton panel grâce à une implémentation LayoutManager

[ ... ]


Merci pour l'idée, mais sur le fond c'est ce que je voulais éviter :
avoir à faire le calcul de positionnement "à la main".

Autrement utilise le FormLayout de jgoodies
[ ... ]


Ça semble faire parfaitement ce que je veux et surtout "comme" je veux,
je vais donc essayer de ce pas. Mais celà semble donc confirmer ce que
je ne voulais pas croire : un Container ne "sait pas", via l'API
standard, centrer son contenu... Bon, à vrai dire c'est pas un "besoin"
que j'ai (pas de projet qui repose là dessus), je voulais juste voir "ce
qu'on pouvait faire". Peut-être n'y a-t-il pas de vrais besoins, je sais
pas...

Merci beaucoup en tous les cas.

phep

Avatar
Symon
Euh, si j'ai bien compris un BorderLayout devrais faire l'affaire... ?

// dans le constructeur de ta frame

getContentPane().setLayout(new BorderLayout());
getContentPane().add(new MonPanel(), BorderLayout.CENTER);

Ton panel s'aggrandira pour remplir la frame, après, tu met ce que tu
veux dedans. Si j'ai bien compris, c'est une sorte de formulaire... Dans
ce cas, un GridBagLayout convient parfaitement (ou un GridLayout si tu
veux faire simple, mais tu ne pourras pas ajuster le poid de chacun des
composants).

Bon courage avec les LayoutManager, on galère au début, mais on arrive
vite à faire des choses très évoluées.

A+

Symon

phep wrote:
Bonjour,

Je démarre avec Swing et je m'arrache les cheveux depuis un bon moment
sur un problème certainement très bête en faisant des tests pour bien
comprendre les techniques de positionnement.

Soit une appli très basique avec une JFrame à la base, je souhaiterai
que cette JFrame contienne un JPanel, centré verticalement et
hrorizontalement au milieu d'elle de telle manière que si la JFrame a un
fond bleu on voie le contenu du JPanel entouré de bandes bleues.
Idéalement, le JPanel pourrait se redimensionner (en + ou en-) en
fonction de la taille de son contenu.

Au mieux, avec un BoxLayout appliqué sur la JFrame, je réussis à centrer
horizontalement mais le JPanel reste "collé au plafond". J'ai testé
aussi un BorderLayout avec le constructeur permettant de spécifier les
hgap et vgap mais sans plus de succès, itou avec le GridLayout. Un
FlowLayout ne m'aide pas pour l'alignement vertical...

La seule méthode que je n'ai pas encore testée c'est le positionnement
absolu en calculant ou vérifiant toutes les tailles parce que je me dis
qu'il doit bien y avoir un moyen mon char à boeuf de faire ça, non ?

L'ami google ne m'a pas dit grand chose...

Merci d'avance pour toute piste,

phep


Avatar
Black Myst
phep wrote:
Bonjour,

Je démarre avec Swing et je m'arrache les cheveux depuis un bon moment
sur un problème certainement très bête en faisant des tests pour bien
comprendre les techniques de positionnement.

Soit une appli très basique avec une JFrame à la base, je souhaiterai
que cette JFrame contienne un JPanel, centré verticalement et
hrorizontalement au milieu d'elle de telle manière que si la JFrame a un
fond bleu on voie le contenu du JPanel entouré de bandes bleues.
Idéalement, le JPanel pourrait se redimensionner (en + ou en-) en
fonction de la taille de son contenu.

Au mieux, avec un BoxLayout appliqué sur la JFrame, je réussis à centrer
horizontalement mais le JPanel reste "collé au plafond". J'ai testé
aussi un BorderLayout avec le constructeur permettant de spécifier les
hgap et vgap mais sans plus de succès, itou avec le GridLayout. Un
FlowLayout ne m'aide pas pour l'alignement vertical...

La seule méthode que je n'ai pas encore testée c'est le positionnement
absolu en calculant ou vérifiant toutes les tailles parce que je me dis
qu'il doit bien y avoir un moyen mon char à boeuf de faire ça, non ?


Avec un GridBagLayout on peut faire ce que tu veux... c'est pas le plus
simple des layout manager à maitriser, mais il permet de faire quand
meme beaucoup de chose :-)




L'ami google ne m'a pas dit grand chose...

Merci d'avance pour toute piste,

phep


Avatar
phep
Symon wrote:
Euh, si j'ai bien compris un BorderLayout devrais faire l'affaire... ?

// dans le constructeur de ta frame

getContentPane().setLayout(new BorderLayout());
getContentPane().add(new MonPanel(), BorderLayout.CENTER);


Hé non, ça c'était mon premier essai. L'effet, comme tu le dis, est que
le panel _remplit_ la frame. Les spec (si je les ai bien lues) précisent
d'ailleurs bien qu'avec BorderLayout.CENTER le "contenu" remplit le plus
de place possible dans le contenant (et il ignore les setMaximumSize()
d'après mes tests). Donc je n'ai pas mes marges.

Ton panel s'aggrandira pour remplir la frame, après, tu met ce que tu
veux dedans. Si j'ai bien compris, c'est une sorte de formulaire... Dans
ce cas, un GridBagLayout convient parfaitement (ou un GridLayout si tu
veux faire simple, mais tu ne pourras pas ajuster le poid de chacun des
composants).


GridBagLayout j'ai regardé l'API mais pas vraiment testé, j'avoue. J'ai
essayé avec GridLayout et ça ne marche pas puisque, dans ce cas d'école,
les marges que je veux sont de la même taille que l'élément central -
or, tant qu'à y être, je préfère que les deux soient dissociés ;-).

Je vais re-jeter un coup d'oeil à GridBagLayout néanmoins, vu le message
de BlackMyst.

Sinon la solution FormLayout de jgoodies donnée par Gaetan semble
marcher mais ça implique un package spécifique.

Bon courage avec les LayoutManager, on galère au début, mais on arrive
vite à faire des choses très évoluées.


Finalement c'est pas si pire que ce que je craignais lorsque j'ai
regardé l'API pour la première fois. Mais bon, y a encore de quoi lire
et tester...

Merci à tous,

phep

Avatar
phep
Je vais re-jeter un coup d'oeil à GridBagLayout néanmoins, vu le message
de BlackMyst.


Bingo ! De loin la plus simple solution.

En plus très chouette finalement ce GridBagLayout.

Merci encore à tous,

phep

Avatar
Hervé AGNOUX
phep wrote:


Soit une appli très basique avec une JFrame à la base, je souhaiterai
que cette JFrame contienne un JPanel, centré verticalement et
hrorizontalement au milieu d'elle de telle manière que si la JFrame a un
fond bleu on voie le contenu du JPanel entouré de bandes bleues.
Idéalement, le JPanel pourrait se redimensionner (en + ou en-) en
fonction de la taille de son contenu.



Et un JPanel avec un bord bleu, placé au centre d'une JFrame disposée avec
un BorderLayout ?


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

Avatar
phep
Hervé AGNOUX wrote:
Et un JPanel avec un bord bleu, placé au centre d'une JFrame disposée avec
un BorderLayout ?


Le code est on ne peut plus court c'est vrai, mais les marges restent
statiques, en fonction de la valeurs des insets du bord bleu. Avec le
GridBagLayout, les bordures sont dynamiques dans la frame, en fonction
du contenu du panel qui reste géré de manière "normale".

Bon, à vrai dire, j'ai pas de besoin précis ; comme je l'ai déjà dit, je
cherche juste à voir "ce qu'on peut tirer du bousin". Après on voit
selon les besoins d'un projet particulier.

Un grand et sincère merci à tous en tout cas, j'ai pas perdu ma journée :-).

phep