Was sind die Best Practices der Java Swing-Entwicklung?

17

Bei meinen Voruntersuchungen zu dieser Frage stellte ich fest, dass es im Internet nicht viele gut organisierte Informationen zu den Best Practices von Java Swing gibt. Also werde ich Stack Exchange eine Chance geben, diese One Great List zu erstellen.

Was sind die Best Practices der Java Swing-Entwicklung? Was haben Sie gefunden, um für Sie zu arbeiten, und warum?

Pops
quelle
2
Ich habe in der Schule mit Swing gespielt und es war keine angenehme Erfahrung. Das Ganze wirkte aufgebläht und unnötig komplex. Am besten ist es, etwas anderes zu verwenden.
Robert Harvey
1
@RobertHarvey "in der Schule spielen" ist weit entfernt von der Bereitstellung von Produktionssoftware. Ich habe festgestellt, dass Swing alles, was dazu gehört, auf vernünftige, logische Weise erledigen kann.
Sagen wir es so: Wenn es bei einem reinen Schulprojekt so schwierig wäre, wäre es bei einem echten fast unvorstellbar schwierig.
Robert Harvey
1
@ Robert Harvey macht kommt mit einem Preis ...
Nur noch eine wichtige Sache. Swing-Komponenten sind serialisierbar und haben viele Vorfahren. Sie sind also in den meisten Fällen zu schwer, um sie zu erben. Sie sollten einige Wickeltechniken in Betracht ziehen, insbesondere wenn Sie einen unserialisierbaren Status haben. Wenn Sie von einer Komponente erben, verwenden Sie sie einfach als Ansicht (in MVC oder einem ähnlichen Muster).
Dávid Horváth

Antworten:

12

Ich kann nur antworten, was für mich funktioniert hat. Andere Kommentatoren haben darauf hingewiesen, dass Java-GUIs im Allgemeinen in das „unheimliche Tal“ nicht ganz nativen Aussehens fallen, und ich bestreite dies nicht.

Nutzen Sie die Action-API. Sie können damit verschiedene Aktionen, die Ihr Benutzer ausführt, besser zusammenfassen und sie einfacher mit Verknüpfungen, Zugriffstasten, Schaltflächen und anderen Eingabeobjekten verknüpfen.

Verwenden Sie einen geeigneten Layout-Manager. GridBagLayout ist extrem leistungsfähig, aber ich würde sogar sagen, dass es ohne übermäßige Anzahl von Kommentaren nicht zu warten ist. Wenn ich statische Code-Analyse-Tools wie Sonar über eine ältere, von mir verwaltete GUI-App starte, werden immer die riesigen Mengen an magischen Zahlen angezeigt, damit das GridBags-Layout genau richtig ist. Ich hatte viel Erfolg mit GroupLayout, bei dem keine pixelgenaue Ausrichtung erforderlich ist.

Wenn Sie glauben, Sie brauchen einen JDialog , tun Sie das wahrscheinlich nicht. Dialogfelder sind in Bezug auf die Benutzererfahrung schrecklich - diese Anwendung entschied sich dafür, sie für jedes Menü und jede Form zu verwenden und die Regeln, die immer im Vordergrund stehen, auf bizarre Weise durchzusetzen. Dies wurde zu einem Wartungs-Albtraum, als wir tatsächlich etwas über das Menü benachrichtigen mussten. Cue frustriertes Klicken auf nicht fokussierbare - und damit nicht entblößbare - Dialoge.

Verwenden Sie SwingWorker, anstatt gegebenenfalls Ihr eigenes Multithreading zu rollen. Es ist sehr einfach, SwingWorker zu erweitern und einige langwierige Aufgaben zu erledigen, während regelmäßig Updates für die GUI bereitgestellt werden. Denken Sie daran, ein Client-Update herunterzuladen. Es übernimmt die Planung des Worker-Threads für Sie und ermöglicht es Ihnen, Download-Prozentsätze wieder in der Ansicht zu veröffentlichen, sodass Sie Ihre ProgressBar oder Ihre vorhandenen aktualisieren können.

Das ist alles, was ich in meiner zugegebenermaßen begrenzten Erfahrung vorschlagen kann.

Tom G
quelle
2
JDialogist völlig in Ordnung - solange Sie es für Dialoge verwenden.
Jonas
1
Ich bin damit einverstanden, dass es ihnen gut geht, wenn Sie sie für Informationen verwenden, die unbedingt sofort gesehen und umgesetzt werden müssen. Die meisten Informationen müssen die Benutzererfahrung jedoch nicht so stark beeinträchtigen. Das war der Punkt hinter meiner Qualifikation.
Tom G
@Jonas Ich denke, der Punkt ist, dass Dialoge eine schlechte Sache sind (unabhängig davon, ob sie mit JDialogoder ohne implementiert sind ).
Tom Hawtin - Tackline
1
Die Kopplung ist ein bisschen stinkend, aber es ist besser, IMO als Ihren eigenen Threading-Code zu schreiben. Ich würde mich lieber mit dem uneleganten Code befassen als mit subtilen Thread-Fehlern.
Tom G
3
Vielleicht möchten Sie MigLayout - miglayout.com
4

Ich würde sagen, eines der ersten Dinge ist, nicht direkt daran zu arbeiten. Das Layout-System in Swing (IMHO) ist schrecklich, und es ist ein Albtraum, eine umfangreiche App daraus zu machen.

Zwei der vielen alternativen Layout-Manager , die ich verwendet habe, sind MigLayout- und MultiSplitPane-Layouts. MigLayout ist allgemeiner und macht jedes Layout, das Sie sich vorstellen können, auf eine einfache, vernünftige Art und Weise. MultiSplitPane ist spezifischer. Ich habe damit einige einfache Layouts für GUIs erstellt, die nicht sehr komplex waren.

EDIT : Dies ersetzt nicht Swing . Wenn Sie Swing verwenden müssen, können Sie diese Layout-Manager weiterhin verwenden, da sie nur Swing verwalten und nicht ersetzen.


Natürlich ist die bessere Alternative, Swing einfach nicht zu benutzen. Swing wird heftig dafür kritisiert, dass es schrecklich ist, damit zu arbeiten, nicht einheimisch und langsam aussieht . Es gibt viele Alternativen, die vom Swingen gelernt haben, was man nicht tun soll, wie Qt, SWT und ich denke sogar GTK. Dies sind großartige langfristige Lösungen für die Kopfschmerzen von Swing

EDIT : Wie @Lord Torgamus sagte, sind diese nicht wirklich verfügbar, wenn Sie gezwungen sind, Swing zu verwenden. Wenn Sie diese verwenden möchten, sollten Sie dies beim Erstellen Ihres Projekts erledigen, nicht bei 3/4 des Durchgangs oder beim Aufnehmen älterer Apps.

Ich möchte auch erwähnen, dass die meisten alternativen GUIs native Bibliotheken verwenden, um wie das Betriebssystem auszusehen, und dann auf Swing oder eine andere reine Java-GUI zurückgreifen.

TheLQ
quelle
4
Ich schätze Ihre Meinung, aber "Don't Use Swing" ist nicht hilfreich für Leute, die sich mit dieser Frage auseinandersetzen, weil sie aus dem einen oder anderen Grund gezwungen sind, Swing zu verwenden.
Pops
@Lord Deshalb habe ich alternative Layout-Manager vorgeschlagen, bevor ich QT und SWT vorschlug. Benutze den Weg, den du kannst.
TheLQ
"Das Layout-System in Swing (IMHO) ist schrecklich, und es ist ein Albtraum, eine umfangreiche App daraus zu machen." Die Layout-Manager kommen in der Regel von AWT, nicht von Swing. Zugegeben, es gibt einige Swing-spezifische wie BoxLayout und GroupLayout. Trotzdem sind Layout-Manager völlig optional ... Sie können stattdessen die Koordinaten für jede Komponente genau wie in .NET WinForms angeben (außer .NET hat eine nette GUI, die dies für Sie erledigt).
Powerlord
3
Schauen Sie sich MigLayout - miglayout.com
1
@TheLQ Ok, ich stimme über Swings Dateimanager überein, dass einer wirklich dumm ist (auch unter Mac OS X). Wie auch immer, ich benutze nur den Dateimanager von AWT, um das zu beheben. Funktioniert auch dann gut, wenn der Rest der Anwendung mit Swing erstellt wurde.
Stommestack