Quelle présentation Swing recommandez-vous?

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 . Alors, si vous avez une application Swing à concevoir, et que vous souhaitez que votre mise en page le soit , quels sont vos gestionnaires de disposition préférés? Des expériences intéressantes / utiles à raconter?

Mise à jour: Oui, bien sûr, je suis conscient que les différents LM sont appropriés pour différentes dispositions. Mais je m’attendrais à ce que la plupart d’entre vous utilisent 1, 2 ou peut-être 3 pour la plupart de ce que vous faites, ou vous ne juriez que par un seul, si polyvalent que vous n’avez jamais besoin de rien d’autre. 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 retardateurs utilisant (disons) BoxLayout ou FlowLayout.

Espérons que la dissortingbution des réponses révélera certaines tendances quant à ce que les gens utilisent le plus pour obtenir Stuff Done


MISE À JOUR et résumé

OK, après presque 2 jours, MiGLayout est définitivement devant! Ses fans seront heureux d’apprendre que cette mise en page entrera bientôt dans la bibliothèque “officielle”.

GroupLayout, FormsLayout et TableLayout sont relativement nouveaux et n’ont pas eu beaucoup d’exposition. Peut-être d’autres seront-ils aussi surpris de les découvrir que moi.

MiGLayout , sans doute. Honnêtement, c’est le seul gestionnaire de mise en page Swing que je connaisse qui ait du sens.

Le simple fait qu’il y ait 8 gestionnaires de disposition dans le JDK central est un bon signe que les créateurs Swing n’avaient absolument aucune idée de ce qu’ils essayaient de faire. Cela ne doit pas nuire au rest du Swing – c’est une bonne boîte à outils graphique, à l’exception des gestionnaires de disposition.

Tous, en combinaison. Exactement. Chaque gestionnaire de mise en page répond à différentes exigences et, en imbriquant des panneaux avec différents gestionnaires de disposition, vous pouvez réaliser presque tout.

Les gestionnaires de disposition “tout faire dans un seul panneau” comme GridBagLayout et GroupLayout (et de nombreux tiers) ont leur place, surtout lorsque vous avez besoin d’aligner des composants dans différentes parties de la mise en page, mais que dans un énorme gâchis difficile à manipuler.

Cela dépend du type d’interface graphique que vous créez. Vous pouvez utiliser seulement une ou deux dispositions simples, ou vous pourriez avoir besoin d’une mise en page plus avancée. Mon utilisation globale de gestionnaire de configuration se décomposerait probablement en quelque chose comme cela, bien que cela varie en fonction du projet:

  • 65% GridBagLayout – La seule disposition qui le fera, peu importe ce que vous devez faire.
  • 15% Box / BoxLayout – Idéal pour coller rapidement et facilement un couple de composants.
  • 12% BorderLayout – Idéal pour joindre un panneau de boutons ou un panneau d’informations à un panneau de contenu. Je l’utilise presque toujours pour append du contenu à un JFrame.
  • 3% FlowLayout – Utile pour les panneaux de boutons, mais pas grand chose d’autre.
  • 3% CardLayout – Principalement utile dans les programmes qui affichent différents panneaux de contenu pour différents modes de fonctionnement.
  • 2% Autres mises en page – Il est très rare que j’aie besoin d’autre chose, mais occasionnellement, l’une des autres mises en page est utile.

Une fois que vous avez compris le GridBagLayout, ce n’est pas si mal d’écrire au départ, 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 était en réalité plus compliqué à utiliser que le GridBagLayout dans ce cas particulier.

Certaines personnes essaient d’éviter GridBagLayout comme la peste; mais la vérité est que certaines combinaisons de mises en page simples peuvent être gérées. Il est bon 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 nesteds inutiles uniquement pour le positionnement des composants, vous devez clairement apprendre à utiliser un GridBagLayout (ou autre). disposition aussi avancée, comme MiGLayout). Vous pouvez obtenir votre interface graphique avec un désordre de BorderLayouts et GridLayouts et BoxLayouts nesteds, mais dès que quelqu’un commence à redimensionner les fenêtres et les boîtes de dialog de votre application pour être plus petit ou plus grand que votre conception initiale, votre interface graphique sera horrible et vos clients commenceront à se faire une opinion négative de votre produit, car vous ne pouviez pas obtenir une chose aussi simple.

Mise à jour: J’utilise WindowBuilder dans Eclipse depuis un certain temps, et cela simplifie grandement 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 tout éditeur visuel avancé, vous pouvez créer les dispositions beaucoup moins rapidement.

DesignGridLayout est superbe et facile à utiliser grâce à une interface fluide .

Il suffit de regarder l’exemple:

entrer la description de l'image ici

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:

  1. BorderLayout , simple et très utile pour concevoir des frameworks de contenu normaux (avec le contenu principal au centre et les aides sur les côtés).
  2. GridLayout , utile lorsque vous avez une grid d’objects de même taille (boutons? Champs de texte?).
  3. GridBagLayout , très flexible, a besoin d’être peaufiné pour qu’il soit correct et très verbeux (mais je le recommande si vous voulez bien faire les choses ).
  4. FlowLayout , inutile .. pas une mise en page très précise: il suffit de placer l’article à côté de l’autre.
  5. CardLayout , utile pour les tabs ou sous-vues qui doivent être basculés.
  6. BoxLayout , ne l’a jamais trop utilisé. Ce devrait être une sorte de FlowLayout amélioré, mais il n’est pas assez flexible pour être utilisé de manière intensive.

GroupLayout est assez décent. À l’origine, il était destiné à être utilisé par les applications GUI Builder, mais je l’ai trouvé très simple à coder manuellement.

FormLayout , une partie du package JGoodies Forms a été un bourreau de travail pour moi. Ce n’est pas parfaitement flexible en ce sens que cela fonctionne durement pour rendre votre conception belle. Je l’ai utilisé pendant plusieurs années sur des dizaines de projets et cela produit 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 c’est dans la bibliothèque Java. Certes, il a besoin d’aide, et l’API est terrible.

GroupLayout fait un vrai désordre de votre code de mise en page. Ok, le code de la plupart des gens est une grosse boule de boue. Mais vous n’avez pas à l’être! Peut-être une interface intéressante pourrait-elle être placée sur ce gestionnaire de mise en page, mais je pense que cela pourrait devoir être cloné et possédé.

Je ne suis pas en faveur de l’introduction de dépendances externes à moins qu’elles ne soient vraiment nécessaires. De plus, de nombreux gestionnaires de disposition tiers utilisent des chaînes de données qui présentent tous les problèmes habituels.

J’utilise généralement la disposition des bordures avec gridlayout , je conçois d’ abord l’ interface utilisateur sur papier prototype;

alt text http://www.usernomics.com/images/paper-mockup.jpg

Après cela, nous pouvons diviser l’écran en gridlayout sur borderlayout. Dans cette image, nous voyons la partie NORTH, CENTER, SOUTH (éléments BorderLayout) et la disposition de chaque partie peut être gridlayout ou BorderLayout, cela dépend de vous. Les mêmes dispositions peuvent être utilisées l’une dans l’autre.

Il n’y a pas de réponse réelle à 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 gourou de Swing, mais j’ai créé deux interfaces graphiques (modérément avancées) et je n’ai jamais eu besoin de toucher au gestionnaire GridBagLayout. J’ai toujours été capable de créer mon interface graphique en utilisant une combinaison de gestionnaires de disposition “plus faciles”. Par exemple, vous pouvez donner à votre cadre le BorderLayout, puis placer une autre disposition dans le SUD de ce BorderLayout.

Utilisez IntelliJ IDEA avec son concepteur graphique. Rend GridBagLayout facile.

http://madbean.com/anim/totallygridbag/

Je n’utilise que GridBagLayout , en particulier lors d’interfaces complexes, croyez-moi que GridBagLayout peut tout faire. J’ai également recommandé le FlowLayout , car il est facile à utiliser et compréhensible, ce qui permet de placer 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 le MigLayout 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 est le gestionnaire de disposition de swing. Là d’autres n’ont pas beaucoup d’exposition.

Je suis un néophyte Swing, mais au cours de l’écriture de ma première application Swing, j’ai essayé quatre gestionnaires de disposition différents: FlowLayout, BoxLayout, GridLayout et GroupLayout. À mon avis, FlowLayout et BoxLayout semblent les plus appropriés pour disposer de groupes de composants de tailles similaires. Pour les composants de tailles différentes, GroupLayout semble être la solution. Une courbe d’apprentissage plus raide que les deux autres, mais qui en vaut vraiment la peine. En ce qui concerne GridLayout, je pense que vous pouvez obtenir les mêmes résultats qu’avec ce gestionnaire de mise en page en utilisant une combinaison de FlowLayout et de BoxLayout – et vous aurez probablement plus de contrôle sur le placement de vos composants. Mais peut-être que c’est juste moi 🙂

Sheldon