Il y a 8 gestionnaires de disposition dans la bibliothèque Java seule, et il y a aussi un tas de produits tiers.
L'autre jour, j'ai essayé d'utiliser SpringLayout et ... eh bien, ça ne marche pas pour moi. Voir mon autre question . Donc ... si vous avez une application Swing à concevoir et que vous voulez votre mise en page c'est vrai, quels sont vos gestionnaires de mise en page préférés? Avez-vous des expériences intéressantes/utiles à raconter?
Mise à jour: Oui, bien sûr, je suis conscient que différents LM sont appropriés pour différentes mises en page. Mais je m'attends à ce que la plupart d'entre vous utilisent 1, 2 ou peut-être 3 pour presque tout ce que vous faites, ou vous ne jurez que par un seul qui est si polyvalent que vous n'avez jamais besoin d'autre chose. Avec suffisamment de réponses, je m'attendrais à voir quelque chose comme une courbe en cloche, avec un pic sur GridBagLayout ou MigLayout (par exemple) et une longue queue de quelques retardataires utilisant (disons) BoxLayout ou FlowLayout.
Espérons que la distribution des réponses révélera certaines tendances quant à ce que les gens utilisent le plus pour Faire avancer les choses ™
OK, après presque 2 jours, MiGLayout est définitivement devant! Ses fans seront ravis d'apprendre qu'il semble que cette mise en page entrera bientôt dans la bibliothèque "officielle".
GroupLayout, FormsLayout et TableLayout sont relativement nouveaux et n'ont pas été beaucoup exposés. Peut-être que d'autres seront aussi surpris de les découvrir que moi.
MiGLayout , sans aucun doute. Honnêtement, c'est le seul gestionnaire de disposition Swing que je connaisse qui ait du sens.
Le simple fait qu'il y ait 8 gestionnaires de mise en page dans le noyau JDK est un bon signe que les créateurs de Swing n'avaient absolument aucune idée de ce qu'ils essayaient de faire. Il ne s'agit pas de jeter le reste du Swing - c'est une bonne boîte à outils GUI, à l'exception des gestionnaires de mise en page.
Cela dépend du type d'interface graphique que vous créez. Vous pouvez utiliser uniquement une ou deux des mises en page simples, ou vous devrez peut-être rechercher une mise en page plus avancée. Mon utilisation globale du gestionnaire de mise en page se décomposerait probablement en quelque chose comme ceci, bien que cela varierait en fonction du projet:
Une fois que vous maîtrisez GridBagLayout, ce n'est pas si mal d'écrire au début, mais ce n'est toujours pas joli de travailler avec ou de déboguer plus tard. J'ai essayé MiGLayout pour quelque chose récemment et j'ai été déçu de constater que le MiGLayout a finalement été plus compliqué à utiliser que le GridBagLayout dans ce cas particulier.
Certaines personnes essaient d'éviter GridBagLayout comme la peste; mais la vérité est qu'il y a certaines choses qu'aucune combinaison de dispositions simples ne pourra gérer. C'est bien de diviser une interface graphique en panneaux pour différentes sections logiques, mais je pense que si vous créez tout un tas de panneaux supplémentaires imbriqués inutiles uniquement dans le but de positionner des composants, vous devez clairement apprendre à utiliser un GridBagLayout (ou autre disposition également avancée, comme MiGLayout). Vous pouvez faire en sorte que votre interface graphique soit correcte avec un désordre désagréable de BorderLayouts et GridLayouts et BoxLayouts imbriqués, mais dès que quelqu'un commence à redimensionner les fenêtres et les boîtes de dialogue de votre application pour qu'elles soient plus petites ou plus grandes que vous les aviez initialement conçues, votre interface graphique sera probablement horrible et vos clients commenceront à se faire une opinion négative sur votre produit, car vous ne pouvez pas obtenir une chose aussi simple.
Mise à jour: J'utilise WindowBuilder dans Eclipse depuis un certain temps maintenant, et cela simplifie considérablement le travail avec de nombreuses dispositions, en particulier GridBagLayout. J'avais l'habitude de passer beaucoup de temps à écrire des mises en page à la main, mais avec WindowBuilder ou probablement n'importe quel éditeur visuel avancé, vous pouvez créer les mises en page en beaucoup moins de temps.
DesignGridLayout
les deux sont superbes et faciles à utiliser via une interface fluide .
regardez simplement l'exemple:
avec juste quelques lignes de code propre:
layout.row().grid(label("Last Name")) .add(lastNameField) .grid(label("First Name")) .add(firstNameField);
layout.row().grid(label("Phone")) .add(phoneField) .grid(label("Email")) .add(emailField);
layout.row().grid(label("Address 1")) .add(address1Field);
layout.row().grid(label("Address 2")) .add(address2Field);
layout.row().grid(label("City"), 1) .add(cityField);
layout.row().grid(label("State")) .add(stateField) .grid(label("Postal Code")) .add(postalField);
layout.row().grid(label("Country"), 1) .add(countryField);
layout.emptyRow();
layout.row().center().add(newButton).add(deleteButton).add(editButton).add(saveButton).add(cancelButton);
Cela dépend du type de mise en page dont vous avez besoin, c'est pourquoi vous en avez 8:
BorderLayout
, simple et très utile pour concevoir des cadres de contenu normaux (avec le contenu principal au milieu et des aides sur les côtés).GridLayout
, utile lorsque vous avez une grille d'objets qui doivent être de la même taille (boutons? champs de texte?).GridBagLayout
, très flexible, a besoin de quelques ajustements pour être bien et il est assez verbeux (mais je le recommande si vous voulez bien faire les choses).FlowLayout
, inutile .. pas très agencé: il suffit de placer un élément l'un à côté de l'autre.CardLayout
, utile pour les onglets ou les sous-vues à changer.BoxLayout
, je ne l'ai jamais trop utilisé .. ça devrait être une sorte de FlowLayout
amélioré mais ce n'est pas assez flexible pour être utilisé intensivement.GroupLayout est assez décent. Il était à l'origine destiné à être utilisé par les applications GUI Builder, mais je l'ai trouvé très simple à coder à la main également.
FormLayout
, une partie du paquet JGoodies Forms a été un cheval de bataille pour moi. Il n'est pas parfaitement flexible dans la mesure où il travaille dur pour que votre design soit beau. Je l'utilise depuis plusieurs années sur des dizaines de projets et il continue de produire rapidement de bons résultats.
Vous spécifiez votre mise en page dans un texte lisible par l'homme, puis ajoutez les composants. Terminé.
GridBagLayout
. Fait à peu près tout ce dont vous avez besoin (en quelque sorte) et il est dans la bibliothèque Java. Certes, il a besoin d'aide, et l'API est terrible.
GroupLayout
fait un vrai gâchis de votre code de mise en page. D'accord, donc le code GUI de la plupart des gens est une grosse boule de boue. Mais le vôtre ne doit pas l'être! Peut-être qu'une belle interface pourrait être mise sur ce gestionnaire de mise en page, mais je soupçonne qu'elle pourrait devoir être clonée et détenue.
Je ne suis pas favorable à l'introduction de dépendances externes à moins qu'elles ne soient vraiment nécessaires. De nombreux gestionnaires de mise en page tiers utilisent également des chaînes de données, qui présentent tous les problèmes habituels.
J'utilise généralement disposition de la bordure avec gridlayout , d'abord je conçois l'interface utilisateur sur un prototype de papier comme;
(source: sernomics.com )
Après cela, nous pouvons diviser l'écran en quadrillage sur borderlayout. Dans cette image, nous voyons la partie NORD, CENTRE, SUD (éléments BorderLayout) et la disposition de chaque partie peut être une disposition en grille ou BorderLayout, cela dépend de vous. Les mêmes dispositions peuvent utiliser l'une dans l'autre.
Il n'y a pas de vraie réponse à votre question sauf que: cela dépend. Cela dépend du type de cadre (formulaire) que vous essayez de créer. Je ne suis pas un Swing-gourou, mais j'ai créé quelques GUI (modérément avancés) et je n'ai jamais eu besoin de toucher le gestionnaire GridBagLayout. J'ai toujours été en mesure de créer mes interfaces graphiques en utilisant une combinaison de gestionnaires de mise en page "plus faciles". Par exemple, vous pouvez donner à votre cadre BorderLayout, puis placer une autre disposition au SUD de ce BorderLayout.
Utilisez IntelliJ IDEA avec son concepteur graphique. Rend GridBagLayout facile.
J'utilise uniquement GridBagLayout
, surtout lorsque je fais des interfaces complexes, croyez-moi GridBagLayout
peut tout faire. J'ai également recommandé le FlowLayout
, car il est facile à utiliser et compréhensible, bon pour mettre un groupe de boutons. En fait, je n'utilise que ces deux dispositions car il fait partie de la bibliothèque JDK comme pour le MigLayout
Je ne l'ai pas encore essayé donc pour l'instant je ne peux pas le recommander pour vous.
Les options de mise en page suivantes sont disponibles:
MiGLayout
TableLayout
GroupLayout
FormsLayout
Parmi ceux-ci, MigLayout est le plus recommandé car il s'agit du gestionnaire de mise en page swing. Là, d'autres n'ont pas été très exposés.
Je suis néophyte Swing, mais au cours de la rédaction de ma première application Swing, j'ai essayé quatre gestionnaires de mise en page différents: FlowLayout, BoxLayout, GridLayout et GroupLayout. À mon avis, FlowLayout et BoxLayout semblent les plus appropriés pour disposer des groupes de composants de tailles similaires. Pour les composants de tailles différentes, GroupLayout semble être la voie à suivre. Courbe d'apprentissage plus abrupte que les deux autres, mais ça vaut vraiment le coup. En ce qui concerne GridLayout, je dirais que vous pouvez obtenir les mêmes résultats qu'avec ce gestionnaire de disposition en utilisant une combinaison de FlowLayout et BoxLayout - et vous auriez probablement plus de contrôle sur le placement de vos composants. Mais c'est peut-être juste moi :)
Sheldon