JavaFX MVP Anwendung mit Spring und Guava’s EventBus

veröffentlicht am 02. Mai 2013

In meinem letzten Artikel Ereignisorientierte Programmierung mit Spring und Guava’s EventBus habe ich bereits eine Möglichkeit gezeigt, wie Komponenten sauber voneinander entkoppelt werden können. Jetzt gehe ich einen Schritt weiter und nutze diesen Mechanismus in einer JavaFX Anwendung, die mit dem MVP (Model View Presenter) Entwurfsmuster umgesetzt wird.

Dieser Artikel zeigt die Implementierung folgender unspektakulären Anwendung, die die Anzahl der Klicks auf einen Knopf anzeigt. Der Umfang des Quellcodes steht in keinem Verhältnis zu der Funktionalität. Dieser Artikel soll stattdessen als Grundlage für eine saubere Anwendungsarchitektur verstanden werden. Jeder Softwareentwickler kennt nicht umsonst den Ausdruck historisch gewachsene Anwendung ;)

JFX Counter

Wie immer beginne ich mit dem Anlegen eines neuen Maven Projektes. Das POM dazu sieht wie folgt aus:

Der Quellcode konnte nicht abgerufen werden

Die Spring Konfiguration ist bis auf das Package identisch mit der aus dem letzten Artikel:

Der Quellcode konnte nicht abgerufen werden

Auch wird derselbe BeanPostProcessor verwendet, um Abonnementen automatisch von Spring am EventBus zu registrieren:

Der Quellcode konnte nicht abgerufen werden

Basierend auf Stephen Chin’s Artikel JavaFX in Spring Day 1 – Application Initialization entstand folgende Klasse zur Integration von Spring und JavaFX:

Der Quellcode konnte nicht abgerufen werden

Zunächst wird hier der Spring Kontext initialisiert, wodurch auch alle Model, View und Presenter Instanzen erzeugt und konfiguriert werden. Außerdem wird das automatisch von JavaFX erzeugte Stage Objekt nicht wie üblich direkt konfiguriert, mit Komponenten bestückt und dann gerendert, sondern zunächst in ein Ereignis (Event) Objekt verpackt und über den EventBus verteilt. Das Ereignis dazu sieht wie folgt aus:

Der Quellcode konnte nicht abgerufen werden

Behandelt wird dieses Ereignis vom folgenden Presenter (Methode renderPrimaryStage) , der bereits durch Spring initialisiert wurde:

Der Quellcode konnte nicht abgerufen werden

Bei der Initialisierung wurden die Komponenten der von Spring injizierten View bereits beschriftet, mit einer Ereignisbehandlung ausgestattet und an das Model gebunden. Interessant ist hier, dass das Drücken des Knopfes nicht direkt behandelt wird, sondern wiederum folgendes Ereignis über den EventBus verteilt. So können beliebige Abonnementen auf das Ereignis reagieren. In diesem Beispiel wird das Ereignis nur von der Methode countBtnClicked des Presenters behandelt.

Der Quellcode konnte nicht abgerufen werden

Das View Objekt fällt gewollt einfach aus. Alles, was über die reine Darstellung hinaus geht, fällt in die Zuständigkeit des Presenters:

Der Quellcode konnte nicht abgerufen werden

Jetzt fehlt nur noch das Model Objekt für den Zähler:

Der Quellcode konnte nicht abgerufen werden

Quellen und weiterführende Links

Hinterlasse einen Kommentar