Java GUI Frameworks. Was auszusuchen? Swing, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot? [geschlossen]

228

Es gibt ziemlich viele GUI-Frameworks für Java, aber was wird als heutiges Framework der Wahl anerkannt?

Das Folgende ist mein Verständnis der verschiedenen Frameworks. Bitte korrigieren Sie mich, wenn ich falsch liege. Dies ist eine sehr lose definierte Reihe von Fragen, aber ich denke immer noch, dass es für jeden wertvoll ist, der daran denkt, reichhaltige GUI-Anwendungen zu erstellen.


AWT

Ist das Fundament des Swings, es funktioniert gut, aber es fehlen fortschrittliche Komponenten. Wenn Sie umfangreiche Anwendungen erstellen möchten, ist AWT wahrscheinlich nicht der richtige Weg. Für kleinere GUI-Anwendungen, für die keine umfangreichen Benutzeroberflächen erforderlich sind. Dies könnte perfekt passen, da es sich um ein bewährtes Framework handelt.


Schwingen

Basierend auf AWT wie zuvor angegeben. In den Kinderschuhen galt es als langsam und fehlerhaft und veranlasste IBM, SWT für Eclipse zu erstellen. Mit Java 5 (oder 6?) Wurde Swing jedoch zum bevorzugten Framework für die Erstellung neuer Anwendungen. Swing hat viele reichhaltige Komponenten, fehlt aber in einigen Bereichen noch. Ein Beispiel ist, dass es keine voll funktionsfähige TreeTable-Komponente gibt, die sortieren und filtern / suchen kann.


SWT

Von IBM für Eclipse entwickelt, schienen sie zu glauben, dass Swing zu diesem Zeitpunkt nicht für Eclipse geeignet war. An sich ist es ziemlich einfach und verwendet die nativen Widgets der Plattform über JNI. Es hat überhaupt nichts mit Swing und AWT zu tun. Ihre API ist jedoch etwas klobig und nicht intuitiv. Sie haben einige erweiterte Komponenten wie eine TreeTable. (aber ich glaube nicht, dass sie das sofortige Sortieren und Filtern unterstützen). SWT verwendet einige native Bindungen (über JNI?) Und im Internet heißt es, dass dieses Framework in heutigen Projekten nicht verwendet werden sollte. (warum nicht?)


SwingX

Basierend auf Swing und seiner Mission ist es, reichhaltige Komponenten für den Swing zu erstellen. Noch in der Entwicklung. (allerdings nicht sehr aktiv.) Haben Sie einen sehr schönen Satz von Komponenten, wie zum Beispiel TreeTable. Aber die TreeTable unterstützt, soweit ich weiß, das Filtern und Sortieren nicht. Es unterstützt jedoch die Suche mit Hervorhebung.

Beachten Sie, dass SwingX Komponenten (AFAIU) sind, die Erweiterungen oder Zusammensetzungen vorhandener Swing-Komponenten sind


JGoodies

Ein Rahmen, von dem ich nichts weiß ... Was sind seine Stärken und Schwächen? Was unterscheidet Jgoodies von den anderen?

Bei JGoodies OTOH geht es um PLAFs und Layouts.


JavaFX

Das neueste Flaggschiff von Java / Oracle. verspricht, der Facto-Standard bei der Entwicklung umfangreicher Desktop- oder Webanwendungen zu sein.


Apache Pivot

Es rendert die Benutzeroberfläche mit Java2D und minimiert so die Auswirkungen von (IMO, aufgeblähten) Hinterlassenschaften von Swing und AWT. (@Augustus Thoo)

Das Hauptaugenmerk scheint auf RIA (Rich Internet Applications) zu liegen, aber es scheint auch auf Desktop-Anwendungen angewendet werden zu können. Und als persönlicher Kommentar sieht es sehr interessant aus! Mir gefällt besonders, dass es ein Apache-Projekt ist.

https://cwiki.apache.org/PIVOT/frequently-asked-questions-faq.html


Qt Jambi

Ein Java-Wrapper für die native qt-Bibliothek, die in c / c ++ geschrieben ist. Sehr mächtig, weit verbreitet und akzeptiert. Hat viele GUI-Komponenten und eine einfach zu bedienende API.

http://qt-jambi.org/


Also, um zu versuchen, ein bisschen zusammenzufassen, was ich frage:

Angenommen, ich wollte heute eine Desktop-Anwendung in Java erstellen, die viele erweiterte Komponenten enthält. Was soll ich wählen? Und warum?

Welches dieser Frameworks sollte als veraltet und welches als Framework der fernen Zukunft anerkannt werden?

Was ist das heutige De-facto-Standard-Framework und welche Tools verwenden Sie zum Erstellen von Java-GUI-Anwendungen?


Ich könnte es bereuen, dies gefragt zu haben, aber ich werde es trotzdem versuchen:

C # /. Net soll einen sehr guten Satz einfach zu bedienender Komponenten haben, die in jede mögliche Richtung gebogen werden können. Und nachdem ich verschiedene Java-Frameworks bis zu einem gewissen Grad untersucht habe, kann ich anscheinend nicht dasselbe über Java sagen. Warum ist das? Warum verfügt Java (die weltweit am häufigsten verwendete Programmiersprache) nicht über dieselben GUI-Komponenten?

Ist es nur so, dass Java seine GUI-Komponenten auf einer viel niedrigeren Ebene basiert und es möglich ist, all diese fortgeschrittenen Komponenten zu schreiben, nach denen ich suche, aber Sie müssen viel tun, wenn nicht die ganze Arbeit selbst?

netbrain
quelle
Mir war nicht bewusst, dass SWT "auf einer Kombination von AWT und Swing basiert". Ist das wirklich der Fall? Ich dachte, es wäre reine JNI, das Fenstersystem des Betriebssystems aufzurufen ...
Rich
@ Rich Oh, es wurde in einem der Antwortkommentare gesagt. Ich nahm nur an, dass sie wussten, wovon sie sprachen.
Netbrain
4
Ich denke, Sie verwechseln "UI Toolkit" und "GUI Framework". AWT, Swing und SWT sind UI-Toolkits, aber ich würde sie sicherlich nicht als "Frameworks" bezeichnen. Frameworks basieren auf einem bestimmten UI-Toolkit und bieten den Klebstoff zum Erstellen Ihrer Anwendung. Zuerst sollten Sie das UI-Toolkit auswählen und dann ein Framework auswählen, das mit diesem Toolkit funktioniert. FWIW, ich würde Swing mit meinem eigenen hausgemachten Guts-GUI-Framework wählen :-)
jfpoilpret
1
Es ist fast immer Swing vs. SWT (zumindest für mich), für einen kleinen Vergleich könnten Sie überprüfen, was die wichtigsten Dinge sind, die ein erfahrener Java SWT-Programmierer beachten sollte, wenn er zu Swing wechselt? ..
Sorceror
2
JavaFX ist nicht mehr Teil des Vorschau-SDK und steht für die Produktion zur Verfügung. Bitte aktualisieren Sie diesen Beitrag.

Antworten:

79

Entscheidungsbaum:

  1. Frameworks wie Qt und SWT benötigen native DLLs. Sie müssen sich also fragen: Werden alle erforderlichen Plattformen unterstützt? Können Sie die nativen DLLs mit Ihrer App verpacken?

    Hier erfahren Sie, wie Sie dies für SWT tun .

    Wenn Sie hier die Wahl haben, sollten Sie Qt SWT vorziehen. Qt wurde von Leuten entwickelt, die die Benutzeroberfläche und den Desktop verstehen, während SWT aus der Notwendigkeit heraus entwickelt wurde, Eclipse schneller zu machen. Es ist eher ein Performance-Patch für Java 1.4 als ein UI-Framework. Ohne JFace fehlen Ihnen viele wichtige UI-Komponenten oder sehr wichtige Funktionen von UI-Komponenten (wie das Filtern nach Tabellen).

    Wenn SWT eine Funktion fehlt, die Sie benötigen, ist das Framework etwas feindlich gegenüber einer Erweiterung. Sie können beispielsweise keine Klasse darin erweitern (die Klassen sind nicht endgültig, sie lösen nur Ausnahmen aus, wenn das Paket von this.getClass()nicht vorhanden ist, org.eclipse.swtund Sie können diesem Paket keine neuen Klassen hinzufügen, da es signiert ist).

  2. Wenn Sie eine native, reine Java-Lösung benötigen, haben Sie den Rest. Beginnen wir mit AWT, Swing, SwingX - dem Swing-Weg.

    AWT ist veraltet. Swing ist veraltet (vielleicht weniger, aber in den letzten 10 Jahren wurde nicht viel an Swing gearbeitet). Man könnte argumentieren, dass Swing anfangs gut war, aber wir alle wissen, dass Code verrottet. Dies gilt insbesondere für Benutzeroberflächen von heute.

    Das lässt Sie mit SwingX. Nach einer längeren Zeit langsamer Fortschritte hat sich die Entwicklung wieder beschleunigt . Der Hauptnachteil von Swing ist, dass es an einigen alten Ideen festhält, die vor 15 Jahren sehr blutig waren, sich aber heute "ungeschickt" anfühlen. Beispielsweise unterstützen die Tabellenansichten das Filtern und Sortieren, Sie müssen dies jedoch noch konfigurieren. Sie müssen viel Code für die Kesselplatte schreiben, um eine anständige Benutzeroberfläche zu erhalten, die sich modern anfühlt.

    Ein weiterer schwacher Bereich ist das Thema. Ab heute gibt es viele Themen. Hier finden Sie die Top 10 . Aber manche sind langsam, manche fehlerhaft, manche unvollständig. Ich hasse es, wenn ich eine Benutzeroberfläche schreibe und Benutzer sich beschweren, dass etwas für sie nicht funktioniert, weil sie ein seltsames Thema ausgewählt haben.

  3. JGoodies ist eine weitere Ebene über Swing, wie SwingX. Es versucht, Swing angenehmer zu machen. Die Website sieht gut aus. Schauen wir uns das Tutorial an ... hm ... immer noch auf der Suche ... Moment mal. Es scheint, dass es überhaupt keine Dokumentation auf der Website gibt. Google zur Rettung . Nein, überhaupt keine nützlichen Tutorials.

    Ich bin nicht sicher mit einem UI-Framework, das sich so sehr bemüht, die Dokumentation vor potenziellen neuen Fans zu verbergen. Das bedeutet nicht, dass JGoodies schlecht ist. Ich konnte einfach nichts Gutes dazu sagen, aber dass es gut aussieht.

  4. JavaFX. Großartig, stilvoll. Unterstützung ist da, aber ich denke, es ist eher ein glänzendes Spielzeug als ein ernstes UI-Framework. Dieses Gefühl beruht auf dem Fehlen komplexer UI-Komponenten wie Baumtabellen. Es gibt eine Webkit-basierte Komponente zum Anzeigen von HTML .

    Als es eingeführt wurde, war mein erster Gedanke "fünf Jahre zu spät". Wenn Ihr Ziel eine schöne App für Telefone oder Websites ist, gut. Wenn Sie eine professionelle Desktop-Anwendung anstreben, stellen Sie sicher, dass diese das liefert, was Sie benötigen.

  5. Pivot. Zum ersten Mal habe ich davon gehört. Es ist im Grunde ein neues UI-Framework, das auf Java2D basiert. Also habe ich es gestern versucht. Kein Swing, nur ein kleines bisschen AWT ( new Font(...)).

    Mein erster Eindruck war schön. Es gibt eine umfangreiche Dokumentation, die Ihnen den Einstieg erleichtert. Die meisten Beispiele enthalten Live-Demos (Hinweis: Java muss in Ihrem Webbrowser aktiviert sein; dies ist ein Sicherheitsrisiko ) auf der Webseite, sodass Sie den Code und die resultierende Anwendung nebeneinander sehen können.

    Nach meiner Erfahrung geht mehr Aufwand in den Code als in die Dokumentation. Beim Betrachten der Pivot-Dokumente muss viel Aufwand in den Code gesteckt worden sein. Beachten Sie, dass derzeit ein Fehler vorliegt, der verhindert, dass einige der Beispiele ( PIVOT-858 ) in Ihrem Browser funktionieren .

    Mein zweiter Eindruck von Pivot ist, dass es einfach zu bedienen ist. Wenn ich auf ein Problem stieß, konnte ich es normalerweise schnell anhand eines Beispiels lösen. Mir fehlt jedoch eine Referenz aller Stile, die jede Komponente unterstützt.

    Wie bei JavaFX fehlen einige übergeordnete Komponenten wie eine Baumtabellenkomponente ( PIVOT-306 ). Ich habe nicht versucht, mit der Tabellenansicht faul zu laden. Mein Eindruck ist, dass wenn das zugrunde liegende Modell das verzögerte Laden verwendet, das ausreicht.

    Vielversprechend. Wenn Sie können, probieren Sie es aus.

Aaron Digulla
quelle
Versuchte Pivot-Demo "Küchenspüle", nach dem Öffnen einiger Gruppen frisst es weiterhin die gesamte CPU. Wenn es am Pivot-Design liegt, dann möchte ich es definitiv nicht in meinen Projekten.
Anzeigename
Scheint, als hätte ich die Ursache
Anzeigename
2
JavaFX 8 (für Java 8 und höher) verfügt über ein TreeTableView-Widget. In JavaFX 2.2 (für Java 7) fehlt dies jedoch, und es fehlen auch Standardfehler- und Info-Dialoge: siehe stackoverflow.com/a/12760202/105137 . Auch die ControlsFX-Widget-Bibliothek ist nur für Java 8 verfügbar: fxexperience.com/controlsfx
kostmo
12

SWT an sich ist ziemlich niedrig und verwendet die nativen Widgets der Plattform über JNI. Es hat überhaupt nichts mit Swing und AWT zu tun. Die Eclipse-IDE und alle Eclipse-basierten Rich Client-Anwendungen wie der Vuze BitTorrent-Client werden mithilfe von SWT erstellt. Wenn Sie Eclipse-Plugins entwickeln, verwenden Sie normalerweise SWT.
Ich entwickle seit fast 5 Jahren Eclipse-basierte Anwendungen und Plugins, daher bin ich eindeutig voreingenommen. Ich habe jedoch auch umfangreiche Erfahrung in der Arbeit mit SWT und dem JFace UI Toolkit, die darauf gebaut ist. Ich habe festgestellt, dass JFace sehr reich und mächtig ist. In einigen Fällen kann dies sogar der Hauptgrund für die Wahl von SWT sein. Sie können damit schnell eine funktionierende Benutzeroberfläche erstellen, sofern diese IDE-ähnlich ist (mit Tabellen, Bäumen, nativen Steuerelementen usw.). Natürlich können Sie auch Ihre benutzerdefinierten Steuerelemente integrieren, aber das erfordert zusätzlichen Aufwand.

Zsolt Török
quelle
Wäre eine erweiterte Komponente wie eine TreeTable mit Spaltensortierung und -filterung Ihrer Meinung nach ein großes Problem bei SWT + JFace?
Netbrain
@netbrain: Ich habe das schon oft gemacht, mit JFace ist das ziemlich einfach. Dies ist, was ich mit einer "IDE-ähnlichen" Schnittstelle gemeint habe, vielleicht nicht die beste Wortwahl.
Zsolt Török
9

Ich möchte ein anderes Framework vorschlagen: Apache Pivot http://pivot.apache.org/ .

Ich habe es kurz ausprobiert und war beeindruckt von dem, was es als RIA-Framework (Rich Internet Application) ala Flash bieten kann .

Es rendert die Benutzeroberfläche mit Java2D und minimiert so die Auswirkungen von (IMO, aufgeblähten) Hinterlassenschaften von Swing und AWT.

Augustus Thoo
quelle
1
Ich hatte den Eindruck, dass Netbrain nach Desktop-Apps fragte. Berücksichtigen Sie bei RIA-Frameworks auch GWT und Vaadin. Mit diesen Frameworks können Sie in Java schreiben, JavaScript kompilieren und abrufen, das auf allen gängigen Webbrowsern sehr gut läuft.
Costis Aivalis
Kann Pivot nicht für Desktop-Anwendungen angewendet werden?
Netbrain
Vielleicht ist es eine Frage der Definition, aber RIA-Frameworks sind grundsätzlich so konzipiert, dass sie in Browsern ausgeführt werden können.
Costis Aivalis
2
@netbrain: Ja, Sie können Pivot als Desktop-App (JFrame) oder Applet (JApplet) ausführen.
Augustus Thoo
9

Swing + SwingX + Miglayout ist meine Kombination. Miglayout ist so viel einfacher als Swings 200 verschiedene Layout-Manager und viel leistungsfähiger. Außerdem haben Sie die Möglichkeit, Ihre Layouts zu "debuggen". Dies ist besonders praktisch, wenn Sie komplexe Layouts erstellen.

Hilfsmethode
quelle
8

Eine andere Möglichkeit ist die Verwendung von Qt Jambi . Es hat fast die ganze Größe von Qt (viele Komponenten, gute Dokumentation, einfach zu bedienen), ohne den Aufwand von C ++. Ich habe es vor 3-4 Jahren für ein kleines Projekt verwendet, selbst dann war es fast ausgereift.

Vielleicht möchten Sie die Diskussion über Swing vs. Qt hier sehen .

Nimcap
quelle
5

Meine persönliche Meinung: Gehen Sie zusammen mit der NetBeans-Plattform auf Swing.

Wenn Sie erweiterte Komponenten benötigen (mehr als NetBeans bietet), können Sie SwingX problemlos (oder JGoodies) integrieren, da die NetBeans-Plattform vollständig auf Swing basiert.

Ich würde keine große Desktop-Anwendung (oder eine, die groß sein wird) ohne eine gute Plattform starten, die auf dem zugrunde liegenden UI-Framework aufbaut.

Die andere Option ist SWT zusammen mit dem Eclipse RCP, aber es ist schwieriger (wenn auch nicht unmöglich), "reine" Swing-Komponenten in eine solche Anwendung zu integrieren.

Die Lernkurve ist für die NetBeans-Plattform etwas steil (obwohl ich denke, dass dies auch für Eclipse gilt), aber es gibt einige gute Bücher, die ich sehr empfehlen würde.

ein Pferd ohne Name
quelle
1
Beachten Sie, dass SwingX Komponenten (AFAIU) sind, die Erweiterungen oder Zusammensetzungen vorhandener Swing-Komponenten sind. Bei JGoodies OTOH geht es um PLAFs und Layouts. Aber wie Sie sagten, wird sich beides nahtlos in Swing integrieren.
Andrew Thompson
1
+1 Basiere deine Entwicklung auf Swing. Swing basiert auf AWT und enthält leichte Komponenten, die auf allen Plattformen gleich aussehen und sich gleich verhalten. Daher sollten Sie AWT-Komponenten niemals direkt verwenden. Es gibt eine große Anzahl ausgezeichneter Bohnen, die Sie leicht zu Ihrer Entwicklungs-GUI hinzufügen können, z. B. toedter.com JCalendar.
Costis Aivalis
1
@ Andrew Zusätzlich zu PLAF und Layout bietet JGoodies mehr: Beans-Bindung (für Präsentationsmodellmuster), Validierung und ein "JSR-296-ähnliches" Framework (das kommerziell ist).
Jfpoilpret
3

Sie haben Java Desktop Aplication basierend auf JSR296 als integriertes Swing Framework in NetBeans vergessen

Mit Ausnahme von AWT und JavaFX basieren alle Ihre beschriebenen Frameworks auf Swing. Wenn Sie mit Swing beginnen, werden Sie (klar) für all diese Swings (Based Frameworks) verstanden.

ATW, SWT (Eclipse), Java Desktop-Anwendung (Netbeans), SwingX, JGoodies

Alle dortigen Frameworks (ich weiß nichts mehr über JGoodies) inkl. JavaFX hat lange keine Fortschritte gemacht, viele Swing-basierte Frameworks werden gestoppt, wenn nicht ohne die neueste Version

Nur meine Ansicht - die beste davon ist SwingX, erfordert aber tiefstes Wissen über Swing.

Look and Feel für Swing-basierte Frameworks

mKorbel
quelle
Ein Teil davon auf AWT-Komponenten, ein Teil auf Swing JCompoentns, aber zwischen AWT und Swing besteht ein Unterschied zu implementierten, zugänglichen und ererbten Methoden. Beispielsweise implementiert Swing JComponents direkt (API) viele ererbte oder verschachtelte Methoden direkt von AWT :-)
mKorbel
Der JSR296 ist tot. Es wird nicht mehr "gewartet" und die Unterstützung dafür wurde aus NetBeans entfernt. (Und es war nie ein wirklich guter Rahmen für den Anfang)
a_horse_with_no_name
@a_horse_with_no_name das Recht with same progressin SWT, SwingX, neuer Besitzer, neue Maniers
mKorbel
1
SWT, entwickelt von IBM, basiert nicht auf Swing, sondern ist / war eine konkurrierende Technologie. Swing verwendet AWT. JavaFX basiert auch nicht auf Swing. Es ist ein völlig neuer Rahmen. Einige nennen es den Nachfolger von Swing, aber es ist noch zu unreif, um diesen Kampf zu nennen. Ich treffe im Moment genau die gleiche Entscheidung, und Swing ist mein Kandidat, einfach weil es die ausgereifteste und dennoch realistischste Option ist, die es gibt.
Gordon
1
SwingX ist eine Erweiterung von Swing (weshalb Swing-Kenntnisse erforderlich sind). Tatsächlich wurden einige der Funktionen von SwingX in Swing selbst integriert.
Gordon
3

Ich war sehr zufrieden mit Swing für die Desktop-Anwendungen, an denen ich beteiligt war. Ich teile jedoch Ihre Ansicht, dass Swing keine erweiterten Komponenten anbietet. Was ich in diesen Fällen getan habe, ist JIDE zu wählen. Es ist nicht kostenlos, aber auch nicht so teuer und bietet Ihnen viel mehr Werkzeuge. Insbesondere bieten sie eine filterbare TreeTable.

sbrattla
quelle
Gut zu wissen! Also hat JIDE ihre eigenen Komponenten basierend auf Swing erstellt ...
netbrain
Ja, JIDE hat einige Komponenten hergestellt, die Gitter, Bäume, Tabellen, Grafiken und dergleichen abdecken. Wie ich schon sagte, es ist nicht kostenlos, aber angesichts der Zeit, die nötig wäre, um diese Dinge selbst herzustellen, ist es wahrscheinlich besser, wenn Sie etwas verwenden, das bereits hergestellt wurde. Soweit ich weiß, ist JIDE außerdem flexibel, wenn es darum geht, Open Source-Projekte ihre Komponenten im Austausch für einen Link zu ihrer Website oder ein Logo im Dialogfeld "Über" verwenden zu lassen.
Sbrattla
3

Ich würde mit Swing gehen. Für das Layout würde ich das JGoodies-Formularlayout verwenden. Es lohnt sich, das Whitepaper zum Formularlayout hier zu lesen - http://www.jgoodies.com/freeware/forms/

Auch wenn Sie mit der Entwicklung einer riesigen Desktop-Anwendung beginnen möchten, benötigen Sie auf jeden Fall ein Framework. Andere haben auf das Netbeans-Framework hingewiesen. Es hat mir nicht so gut gefallen, also habe ich ein neues geschrieben, das wir jetzt in meiner Firma verwenden. Ich habe es auf sourceforge gestellt, aber nicht die Zeit gefunden, es viel zu dokumentieren. Hier ist der Link zum Durchsuchen des Codes:

http://swingobj.svn.sourceforge.net/viewvc/swingobj/

Das Schaufenster sollte Ihnen zeigen, wie Sie tatsächlich eine einfache Anmeldung durchführen.

Lassen Sie mich wissen, wenn Sie Fragen dazu haben, ich könnte helfen.

Sethu
quelle