Quelles sont les meilleures pratiques de développement Java Swing?


17

En faisant mes recherches préliminaires sur cette question , j'ai constaté qu'il n'y avait pas beaucoup d'informations bien organisées sur les meilleures pratiques Java Swing sur Internet. Je pense donc que je vais essayer Stack Exchange de construire cette One Great List.

Quelles sont les meilleures pratiques de développement Java Swing? Qu'avez-vous trouvé pour travailler pour vous et pourquoi?


2
J'ai joué avec Swing à l'école et ce n'était pas une expérience agréable. Le tout semblait gonflé et inutilement complexe. La meilleure pratique peut consister à utiliser autre chose.
Robert Harvey

1
@RobertHarvey "jouer à l'école" est loin de fournir un logiciel de production. J'ai trouvé que Swing peut faire tout ce qui était requis de manière raisonnable et logique.

Eh bien, formulez-le de cette façon: si c'était si difficile sur un simple projet d'école, ce serait presque inimaginablement difficile sur un vrai.
Robert Harvey

1
@RobertHarvey a un prix ...

Encore une chose importante. Les composants Swing sont sérialisables et ont de nombreux ancêtres. Ils sont donc trop lourds pour hériter dans la plupart des cas. Vous devriez envisager une technique d'emballage, en particulier lorsque vous avez un état non sérialisable. Si vous héritez d'un composant, utilisez-le simplement comme une vue (dans MVC ou un modèle similaire).
Dávid Horváth

Réponses:


12

Je ne peux que répondre de ce qui a fonctionné pour moi. D'autres commentateurs ont souligné que les interfaces graphiques Java en général tombent dans la «vallée étrange» de l'apparence pas tout à fait native, et je ne conteste pas cela.

Faites bon usage de l'API Action. Il vous permet de mieux encapsuler les différentes actions que votre utilisateur effectuera et vous permet de les connecter aux raccourcis, touches accélératrices, boutons et autres objets d'entrée beaucoup plus facilement.

Utilisez un gestionnaire de mise en page approprié. GridBagLayout est extrêmement puissant, mais j'irais jusqu'à dire qu'il est impossible à maintenir sans une quantité excessive de commentaires. Lorsque j'exécute des outils d'analyse de code statique tels que Sonar sur une ancienne application graphique que je maintiens, cela souligne toujours les quantités massives de nombres magiques pour rendre la mise en page GridBags parfaite. J'ai eu beaucoup de succès avec GroupLayout, ce qui évite d'avoir à spécifier un alignement parfait au pixel près.

Si vous pensez avoir besoin d'un JDialog ... vous n'en avez probablement pas. Les boîtes de dialogue sont horribles, en termes d'expérience utilisateur - cette application a décidé de les utiliser pour chaque menu et formulaire, et d'appliquer des règles toujours au top de manière bizarre. Cela s'est transformé en cauchemar de maintenance alors que nous avions effectivement besoin d'alerter quelque chose sur le menu. Cue frustré de cliquer sur des dialogues non focalisés - et donc indissociables -.

Utilisez SwingWorker au lieu de lancer votre propre multithreading, le cas échéant. Il est très facile d'étendre SwingWorker et d'effectuer des tâches de longue durée tout en fournissant des mises à jour régulières à l'interface graphique. Pensez à télécharger une mise à jour client. Il gérera la planification des threads de travail pour vous et vous permettra de publier des pourcentages de téléchargement dans la vue, afin que vous puissiez mettre à jour votre barre de progression ou ce que vous avez.

C'est tout ce que je peux suggérer, dans mon expérience certes limitée.


2
JDialogest parfaitement bien - tant que vous l'utilisez pour les dialogues.
Jonas

1
Je suis d'accord qu'ils vont bien si vous les utilisez pour des informations qui doivent absolument être vues - et mises en œuvre - immédiatement. Mais la plupart des informations n'ont vraiment pas besoin de perturber autant l'expérience utilisateur. C'était le point derrière ma qualification.
Tom G

@Jonas Je pense que le fait est que les dialogues sont une mauvaise chose (qu'ils soient implémentés JDialogou non).
Tom Hawtin - tackline

1
Le couplage est un peu malodorant, mais c'est mieux IMO que d'écrire votre propre code de thread. Je préfère m'occuper du code inélégant que des bogues de threads subtils.
Tom G

3
Vous voudrez peut-être consulter MigLayout - miglayout.com

4

Je dirais que l'une des premières choses est de ne pas y travailler directement. Le système de mise en page de Swing (IMHO) est terrible, et essayer d'en faire une application substantielle est un cauchemar.

Deux des nombreux gestionnaires de mise en page alternatifs que j'ai utilisés sont la mise en page MigLayout et MultiSplitPane. MigLayout est plus généraliste et crée n'importe quelle mise en page à laquelle vous pouvez penser d'une manière simple et saine. MultiSplitPane est plus spécifique; Je l'ai utilisé pour faire des dispositions simples pour les interfaces graphiques qui n'avaient pas beaucoup de complexité.

EDIT : Cela ne remplace pas le swing . Si vous devez utiliser Swing, vous pouvez toujours utiliser ces gestionnaires de disposition, car ils ne gèrent que le swing, pas le remplacer.


Bien sûr, la meilleure alternative est de ne pas utiliser Swing. Swing est fortement critiqué pour être horrible à travailler, ne semble pas natif et lent. Il existe de nombreuses alternatives qui ont appris de swing ce qu'il ne faut pas faire comme Qt, SWT, et je pense même GTK. Ce sont d'excellentes solutions à long terme aux maux de tête de Swing

EDIT : Comme l'a dit @Lord Torgamus, ceux-ci ne sont pas vraiment disponibles si vous êtes obligé d'utiliser Swing. Si vous comptez les utiliser de son mieux pour régler cela lorsque vous créez votre projet, et non les 3/4 en cours de route ou lors de la récupération des applications héritées.

Je voudrais également noter que la plupart des interfaces graphiques alternatives utilisent des bibliothèques natives pour ressembler au système d'exploitation, puis retombent sur Swing ou sur une autre interface graphique Pure Java.


4
J'apprécie votre opinion, mais "n'utilisez pas Swing" n'est pas utile pour les personnes qui se retrouvent à cette question parce qu'elles sont obligées d'utiliser Swing pour une raison ou une autre.
Pops le

@Lord C'est pourquoi j'ai suggéré des gestionnaires de mise en page alternatifs avant de suggérer QT et SWT. Utilisez le chemin que vous pouvez.
TheLQ

"Le système de mise en page de Swing (à mon humble avis) est terrible, et essayer d'en faire une application substantielle est un cauchemar." Les gestionnaires de mise en page proviennent généralement d'AWT, pas de Swing. Certes, il y en a quelques-uns spécifiques à Swing, tels que BoxLayout et GroupLayout. Cela dit, les gestionnaires de disposition sont complètement facultatifs ... vous pouvez plutôt spécifier les coordonnées de chaque composant comme vous le faites dans .NET WinForms (sauf que .NET a une belle interface graphique pour le faire pour vous).
Powerlord

3
Jetez un œil à MigLayout - miglayout.com

1
@TheLQ Ok, je suis d'accord sur le gestionnaire de fichiers de Swing, celui-là est vraiment stupide (sous Mac OS X aussi). Quoi qu'il en soit, j'utilise simplement le gestionnaire de fichiers d'AWT pour résoudre ce problème. Fonctionne bien même si le reste de l'application est fait en utilisant Swing.
stommestack
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.