2016-08-06 33 views
1

こんにちはプログラマーと建築家!
私はここに新しいと私は私の英語が恐ろしいことができると思う! :-D だから...私に注意してください...してください。JavaFX、FXMLおよびコントローラ:シーンの切り替え、シーンデータの維持

私は、JavaFX、FXML、シーンを切り替えるさまざまな方法について、アーキテクチャ上の質問をしています。 私は個人的なソリューションを使用していますが、それはアクセシビリティソリューションかどうかを知る必要がありますアーキテクチャレベル)。

私の解決策を説明しようとします。
Observer Patternの「逆数」の一種を使用しました。代わりに、各オブザーバブルに対して多くのオブザーバを使用し、1人のオブザーバ(特定のクラス)と多くのオブザーバブル(すべてのコントローラ)を使用しました。
シーンを変更するときは、現在のシーンのコントローラがObserverにそのことを通知します。 Observerは古いシーンを削除し、新しいシーンを読み込みます。

いくつかの詳細。
java.util.Observerを実装するSceneObserverという名前のクラスを作成しました。ルート要素広告用としてのみAnchorPanelで新しいシーンを作成し、すべての私のコントローラ

  • 負荷specifc FXMLファイル
  • のオブザーバーとして

    • レジスタSceneObserver:私は順番にでSceneObserverを使用
      enter image description here
      ルート要素に追加するroot.getChildren()。add()メソッドFXML
    • FXMLLoader用の特定のコントローラを設定しました(FXML内では "fx:controller"を使用していません)

    私のすべてのコントローラはjava.util.Observableを拡張しています(これは一例です)。
    enter image description here
    シーンで特定のタイプの状況が発生し、シーンを切り替える必要がある場合、SceneObserverに変更(オブザーバーパターン)を通知し、SceneObserverは古いシーンを破棄して新しいシーンを読み込みます。 つまり、私はすべてのコントローラ(Observe Patternの逆)を観察するために1人のオブザーバのみを使用しています。
    すべての作品が、これでは不十分だと私は知っています!

    したがって、質問は次のとおりです。アーキテクチャレベルでは、これは受け入れやすいソリューションですか?

    私は知っている、これは唯一のものではありませんし、確かに他のより良い方法がありますが、これについてはどうですか?

    なぜこのソリューションを使用しましたか?
    さて、二つの理由:

    1. 負荷のみ必要FXML(より迅速なアプリケーション)
    2. 休暇コントローラはすべてに

    感謝をデカップリングして...私の英語:-(

    ために残念
  • 答えて

    1

    まあ...

    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/

    私が実現することに決めました:

    はその後、私は私が読むことをお勧めしますことを、さまざまなソリューションを読んでテストしてみました私自身の解決策は、より単純なアプローチを使用して:ルーターパターン

    私の目標は、JavaFXアプリケーションのさまざまなコントローラを切り離して、の間で通信できるようにすることでした。
    イベントハンドラ、パラメータ、または廃止されたイベントバスを使用する代わりに、単純なルータパターンが問題を解決できるようです。 すべてのコントローラはルータ(明らかにシングルトン)を認識していなければならず、ルータはすべてのコントローラを認識している必要があります。このようにして、私は多対多のクラス関係を1対多に単純に渡しましたが、「魔法」は何もなく、コントローラ間であらゆる種類のメッセージを送ることができます。小で:各コントローラにIルータオブジェクトを宣言し、そして

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


    ルータに私はこのように、正確にコントローラのインスタンスをリンクするために、各コントローラと設定方法のための1つのプロパティを宣言します(router)と私は(ルータがシングルトンでなければなりません!)これを書い各コントローラのinitialize()方法で:

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

    すべてです。

    関連する問題