2016-08-06 104 views
1

Hallo Programmierer und Architekten!
Ich bin neu hier und ... Ich denke mein Englisch könnte ... schrecklich sein! :-D Also ... sei vorsichtig mit mir ... bitte.JavaFX, FXML und Controller: Szenen wechseln, Szenendaten pflegen

Ich habe eine architektonische Frage über JavaFX, FXML und die verschiedenen Methoden, Szenen zu wechseln, Daten in allen Szenen zu halten ... Ich habe eine persönliche Lösung verwendet und ich muss wissen, ob es eine akzeptable Lösung ist oder nicht (um die architektonische Ebene).

Ich werde versuchen, meine Lösung zu erklären.
Ich habe eine Art "umgekehrte" Observer Pattern verwendet: stattdessen verwenden Sie viele Beobachter für jede Observable, ich habe einen Beobachter (eine bestimmte Klasse) und viele Observablen (alle Controller) verwendet.
Also, wenn es Zeit ist, die Szene zu wechseln, benachrichtigt der Controller der aktuellen Szene den Beobachter, dies zu tun. Beobachter entfernt alte Szene und lädt die neue.

Einige Details.
Ich habe eine Klasse namens SceneObserver erstellt, die java.util.Observer implementiert.
enter image description here
Ich benutze SceneObserver um:

  • Register SceneObserver als Beobachter aller meiner Controller
  • Last eine specifc FXML Datei
  • eine neue Szene erstellen mit nur einem AnchorPanel als Wurzelelement ad Verwendung die Methode root.getChildren(). add() zum Anhängen an das Root-Element die geladene FXML
  • einen bestimmten Controller für den FXMLLoader setzen (ich habe NICHT "fx: controller" innerhalb der verschiedenen FXML verwendet.)

Alle meine Controller erweitern java.util.Observable (dies ist ein Beispiel).
enter image description here
Wenn eine bestimmte Situation in einer Szene auftritt und die Szene gewechselt werden muss, meldet die Szene SceneObserver die Änderung (Observer Pattern), SceneObserver zerstört die alte Szene und lädt die neue Szene. Mit anderen Worten verwende ich nur einen Beobachter, um alle Controller zu beobachten (die Umkehrung des Beobachtungsmusters).
Alles funktioniert, aber ich weiß, dass das nicht genug ist!

Also, die Frage ist: Sprechen auf der architektonischen Ebene, ist dies eine akzeptable Lösung?

Ich weiß, das ist nicht das einzige und sicherlich gibt es andere bessere Möglichkeiten, aber ... was ist mit diesem?

Warum habe ich diese Lösung verwendet?
Nun, zwei Gründe:

  1. Last nur notwendig FXML (schnellere Anwendung)
  2. leave Controller
  3. entkoppelt

Vielen Dank an alle und ... sorry für mein Englisch :-(

Antwort

1

Gut ...

danach Ich habe gelesen und getestet verschiedene Lösungen, die ich zu lesen empfehlen:

https://web.archive.org/web/20160316234709/
https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1
https://github.com/google/guava/wiki/EventBusExplained
http://eventbus.org/

Ich habe beschlossen, zu erkennen, meine eigene Lösung, mit einem einfacheren Ansatz: ein Router Pattern.

Mein Ziel war es, die verschiedenen Controller in meiner JavaFX-Anwendung zu entkoppeln, so dass es möglich ist, zwischen ihren zu kommunizieren.
Anstatt Event-Handler, Parameter oder veralteten Event-Bus zu verwenden, scheint ein einfaches Router-Muster das Problem zu lösen. Jeder Controller muss den Router (offensichtlich ein Singleton) kennen und der Router muss alle Controller kennen. Auf diese Weise habe ich einfach eine Viele-zu-Viele-Klassenbeziehung zu Eins-zu-Viele ohne "Zauberei" umgestaltet und kann unter den Controllern jede Art von Nachrichten senden. In der kleinen:
im Router erklären I eine Eigenschaft für jede Steuerung, und einen Satz Verfahren, um genau diese Instanz des Reglers zu verbinden, wie folgt aus:

public class Router { 
    private MainCtrl mainCtrl; 
    ... 
    protected void setMainCtrl(MainCtrl mainCtrl) { 
     this.mainCtrl = mainCtrl; 
    } 
} 

Dann wird in jedem Controller I einen Router Objekt deklariert (router) und in der initialize() Methode jeden Controller ich dies schreibe (Router muss ein Singleton sein!):

public void initialize() { 
    router.setMainCtrl(this); 
    ... 
} 

das ist alles.