Verwenden von MVC in einer Java-App

10

Ich muss eine plattformübergreifende GUI-Anwendung schreiben, um (in mehreren Threads) ziemlich große Datenmengen zu verarbeiten und zu visualisieren. Idealerweise sollte die Anwendung relativ schnell sein und gut aussehen.

Die Benutzeroberfläche der App besteht aus einem Tabellen-Widget, einem Baum-Widget und einem benutzerdefinierten Widget zum Zeichnen von Figuren. Der Benutzer kann die Daten eines dieser Widgets ändern, und die Änderungen sollten sofort in den anderen Widgets übernommen werden.

Natürlich plane ich MVC zu verwenden. Normalerweise mache ich jedoch meine gesamte GUI-Programmierung in C ++ / Qt und bin nur sehr begrenzt mit Java vertraut. Daher würde ich mich über Ratschläge zur Organisation einer solchen App in Java sehr freuen. Sollte ich insbesondere Swing oder JavaFX verwenden? Welche Widgets würden Sie für den Job auswählen? Könnten Sie Bücher / Online-Tutorials empfehlen, die diese Aspekte der Java-Plattform abdecken?

Ich freue mich über jedes Feedback. Vielen Dank!

(Diese Frage wurde ursprünglich auf Stack Overflow veröffentlicht , aber diese Site wurde als geeigneterer Ort vorgeschlagen, um sie zu stellen.)

egor
quelle

Antworten:

21

Dies ist alles sehr subjektiv, da mehrere verschiedene Technologien Ihre Anforderungen erfüllen können.

Wie andere werde ich wahrscheinlich nur die Technologie empfehlen, die ich persönlich für ein solches Projekt bevorzugen würde, nämlich JavaFX .

Gründe, warum ich JavaFX empfehlen würde, sind:

OK, ich denke, das Obige ist ein bisschen tangential, aber ich mag es, JavaFX zu promoten ;-)

Um auf die spezifischen Punkte Ihrer Frage einzugehen:

  • JavaFX ist ein plattformübergreifendes GUI-Framework (derzeit Mac / Windows / Linux).
  • JavaFX verfügt über eine integrierte, qualitativ hochwertige Unterstützung für mehrere Threads (das Kernframework selbst ist wie fast jede andere GUI-Plattform Single-Threaded, aber Sie können Ihre eigenen Aufgaben definieren, die gleichzeitig außerhalb des GUI-Threads ausgeführt werden sollen, damit der GUI-Thread erhalten bleibt ansprechbar).
  • Ein gut geschriebenes JavaFX-Programm sollte keine Probleme haben, die gut genug funktionieren, um ziemlich große Datenmengen zu visualisieren. Hier ist ein Beispiel für ein JavaFX-Projekt, das dies tut.
  • Die Möglichkeit, die Anwendung über CSS zu gestalten, visuelle Effekte und Animationen zu verwenden, ermöglicht es Ihnen, mit Designern zusammenzuarbeiten, damit Ihre App großartig aussieht, oder es selbst zu tun, wenn Sie über die erforderlichen Fähigkeiten verfügen.
  • JavaFX verfügt über eine TableView und eine TreeView, die Sie verwenden können. Es gibt auch ein kombiniertes TreeTable- Steuerelement, das in Vorbereitung auf die Java 8- Version entwickelt wurde.
  • Das benutzerdefinierte Widget zum Zeichnen von Figuren kann Szenengraphenformen oder eine Leinwand zum direkten Zeichnen verwenden - es ist wirklich nur eine Frage des Codierungsstils und der Präferenz.
  • Die Eigenschaften und Bindungsfunktionen von JavaFX in Verbindung mit den Ereignis-Listener-Frameworks machen es trivial, Daten mit einem Steuerelement zu ändern und die Änderungen sofort in anderen Steuerelementen wiederzugeben.
  • Für die Entwicklung des MVC-Stils können Sie Ihr Modell mit einfachen Java-Objekten schreiben, Ihre Ansicht mit der FXML-Markup-Sprache definieren (auf Wunsch mit dem grafischen Layout-Tool SceneBuilder erstellt) und Ihre Steuerlogik in Java definieren (oder eine andere Skriptsprache, wenn Sie dies bevorzugen). Außerdem sollten Sie Ihren Stil mithilfe von CSS von Ihrer Logik trennen.
  • Da Sie nur begrenzt mit Java vertraut sind, ist die Lernkurve erheblich. Zusätzlich zu den JavaFX-Tutorials, auf die ich zuvor verlinkt habe, gibt es ausgezeichnete Java-Tutorials , die dabei helfen können. Der JavaFX-Kerncode verwendet nur die im JDK verfügbaren Funktionen. Um JavaFX zu verwenden, müssen Sie nicht viele zusätzliche Bibliotheken und Frameworks lernen (wie wenn Sie beispielsweise JavaEE lernen würden). Diese beiden Tuotorial-Sites bieten also die meisten Informationen, die Sie benötigen, um auf dem Laufenden zu bleiben.
  • Für App - Organisation, wenn Sie eine komplexe Anwendung und braucht die Unterstützung eines vollständigen und bewährten Client - Anwendungs - Framework und nichts dagegen viel zusätzlicher Lernen zu tun, dann können Sie einbetten JavaFX in der Eclipse RCP oder NetBeans RCP , die nach Auf ihren Seiten können Sie jahrelange Entwicklungszeit sparen. Ich würde nur empfehlen, sich solche Plattformen anzuschauen, wenn Ihre Anforderungen dies rechtfertigen, da es für kleine bis mittelgroße Projekte wahrscheinlich einfacher ist, das Material ohne die komplexen Client-Plattform-Frameworks wie Eclipse und NetBeans direkt in JavaFX zu codieren.
  • Ich bin nicht wirklich die objektivste Person, um darauf zu antworten, ob Sie Swing oder JavaFX verwenden sollten. JavaFX weist definitiv Mängel auf, die Ihnen bei der Verwendung offensichtlich werden (ebenso wie Swing).
  • Für Online-Tutorials habe ich auf die relevantesten verlinkt. Es gibt ein schönes Tutorial-Set für eine komplette App .
  • Die Bücher Pro JavaFX 2 und JavaFX 2.0 Introduction by Example sind hoch bewertet.
Juwelensee
quelle
Vielen Dank für diese erstaunliche Antwort! JavaFX klingt sicher nach einer süßen Plattform und ich werde definitiv viel Zeit in sie investieren. Außerdem sind beide Bücher, die Sie empfohlen haben, in meiner Bibliothek erhältlich :)
egor
1
Dieser Link "Beste IDEs der Welt" sollte eigentlich nur auf IntelliJ IDEA verweisen;) Tolle Antwort, sehr informativ, danke!
Cooper
1
Es ist zu beachten, dass JavaFX derzeit keine Unterstützung für Barrierefreiheit bietet. Das kann für einige ein Deal Breaker sein (es war für mich) und wird weiterhin Swing verwenden müssen.
Cooper
JavaFX bietet jetzt Unterstützung für Barrierefreiheit. Diese Funktionalität wurde in Java 8u40 bereitgestellt, für das JEP 204: JavaFX Accessibility implementiert wurde.
Jewelsea
5

Verwenden Sie stattdessen ein Model-View-Presenter-Muster . Sie können hier über das mvp4j- Projekt ein gutes MVP-Beispiel in Swing anzeigen .

Obwohl ich nicht Swing bin, würde ich auch die MVP-Artikel auf der GWT Google Developers-Website lesen, um weitere Einblicke in dieses Muster und dessen Anwendung in Java zu erhalten. Unabhängig vom Framework gelten dieselben Konstruktionsprinzipien, und GWT ist Swing sehr ähnlich.

Eine kurze Übersicht über die Funktionsweise von MVP:

  • Ansicht : Eine Klasse, die ausschließlich Ihre GUI-Komponenten enthält. Kein Bewusstsein für Logik oder Modell, nicht einmal Event-Handler. Dies macht Ansichten sehr dumm, aber sehr verfügbar und veränderlich.
  • Presenter : Eine Klasse, die Ihre Anwendungslogik verarbeitet. Ein Präsentator bindet an eine (oder mehrere) Ansichtsklassen und übernimmt die gesamte erforderliche Anwendungslogik und Modellsteuerung.
  • Modell : Ihre Datenmodellobjekte. Es ist am besten, diese so POJO-ähnlich wie möglich zu halten (einfache alte Java-Objekte).

Bei korrekter Implementierung wird Ihre Anwendung durch MVP stark entkoppelt und Sie können Änderungen vornehmen, ohne andere Bereiche Ihrer Anwendung zu stören.

Bearbeiten: Aufgrund Ihrer Entscheidung, JavaFX zu verwenden, würde ich empfehlen, die folgenden Artikel zu lesen

Cooper
quelle
Vielen Dank! Ich denke, ich habe mich für JavaFX entschieden, werde aber etwas über MVP lesen und wie es mit dieser Plattform verwendet werden kann.
egor
1
Groß! Wenn Sie sich für die Verwendung des MVP-Musters entscheiden, finden Sie hier einen Link mit einem Beispiel in JavaFX code.google.com/p/pennychecker-presenter/wiki/JavaFxMvpExample
Cooper
2

Die Widgets , die Sie benötigen , können in beiden gefunden werden Schwingen oder SWT . Die Dokumentation enthält Beispiele für Komponenten (Swing) oder Widgets (SWT), sodass diese relativ einfach zu identifizieren sind.

Swing ist eine GUI-Bibliothek, die in JDK enthalten ist und von Grund auf neu erstellt wurde. SWT ist eine externe und die Komponenten basieren auf nativen.

MVC wird von beiden unterstützt. In Swing haben Sie für jede Komponente ein Modell, das praktisch die zugrunde liegenden Daten bereitstellt. Die Komponente selbst ist sowohl die Ansicht als auch der Controller.

Adrian Ber
quelle