ルックアップの代わりにコントローラークラスのFXMLコントローラーのゲッター?

しんぞう

fxmlをロードstart()していて、borderPaneと表示されているメインウィンドウに配置したいと思います。

        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("Resources/Game.fxml"));
        Parent root = loader.load();
        GameController gameManagerController = loader.getController();

        loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("Resources/TopMenuBar.fxml"));
        Parent topMenuBar = loader.load();
        TopMenuBarController topMenuBarController = loader.getController();

rootID(fx:idではない)を指定したにもかかわらず、でborderPaneを検索するとnullが返されます。だから私の質問は、代わりにborderPaneのゲッターを書いて、代わりにこのようなことをすることは許容されgameManagerControllerますか?

gameManagerController.getBorderPane().setTop(topMenuBar);
James_D

通常、UI要素をコントローラーの外部に公開することはお勧めできません。そうすることで、特定のレイアウトまたは存在する特定のUI要素クラスに依存するコントローラーとFXMLのペアの外部にコードがある可能性があるため、後でUIを編成する方法を変更することがはるかに困難になります。

シンプルですが、より堅牢なソリューションは、メニューをGameController次の場所に表示するためのメソッドを定義することです

public class GameController {

    @FXML
    private BorderPane rootPane ;

    // ...

    public void showMenu(Node menu) {
        rootPane.setTop(menu);
    }

    // ...
}

そして今、あなたはすることができます

gameManagerController.showMenu(topMenuBar);

より複雑なアプローチは、この状況ではやり過ぎかもしれませんが、それでも一見の価値がありますが、「ビューモデル」を使用してアプリケーションのビュー状態を表すことです。

public class ApplicationViewState {

    private final ObjectProperty<Node> menu = new SimpleObjectProperty<>();
    private final ObjectProperty<Node> content = new SimpleObjectProperty<>();

    public ObjectProperty<Node> menuProperty() {
        return menu ;
    }

    public final Node getMenu() {
        return menuProperty().get();
    }

    public final void setMenu(Node menu) {
        menuProperty().set(menu);
    }


    public ObjectProperty<Node> contentProperty() {
        return content ;
    }

    public final Node getContent() {
        return contentProperty().get();
    }

    public final void setContent(Node content) {
        contentProperty().set(content);
    }

    // ...
}

これで、ビューモデルの単一インスタンスをコントローラー間で共有できます。コントローラーは、必要に応じて状態を監視および更新できます。

public class GameController {

    @FXML
    private BorderPane rootPane ;

    private ApplicationViewState viewState ;

    public void setViewState(ApplicationViewState viewState) {
        this.viewState = viewState ;
        rootPane.topProperty().bind(viewState.menuProperty());
    }

    // ...
}

その後

FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("Resources/Game.fxml"));
Parent root = loader.load();
GameController gameManagerController = loader.getController();

loader = new FXMLLoader();
loader.setLocation(getClass().getResource("Resources/TopMenuBar.fxml"));
Parent topMenuBar = loader.load();
TopMenuBarController topMenuBarController = loader.getController();


ApplicationViewState viewState = new ApplicationViewState();
gameManagerController.setViewState(viewState);
viewState.setMenu(topMenuBar);

このアプローチの利点は、他のコントローラーについて「知る」必要なしに、任意のコントローラーがアプリケーションの他の部分のUIを更新するためのメカニズムを提供することです。これは、UIのさまざまな部分を切り離すのに役立ちます。欠点は、アプリケーションの複雑さが増すことです。UIでさまざまなことがどのように発生しているかが明確でないため、デバッグが困難になる可能性があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

fxmlローダーからfxmlコントローラーのメソッドにアクセスする

分類Dev

リロードとエンジンのスプライトの代わりにブラックボックス

分類Dev

ビューの代わりにコントローラー内でAngularルートスコーププロパティ$ resolveにアクセスします

分類Dev

ポップアップボックスコントロールの値をコントローラーページに取り込む

分類Dev

別のコントローラーを押す代わりに、フリップトランジションを使用して新しいナビゲーションスタックを作成する

分類Dev

クロスプラットフォームコンソールのクリア?

分類Dev

symfonyでコントローラーの代わりにアクションクラスを使用します

分類Dev

Angularコンポーネントのゲッターにパラメーターを渡す代わりに

分類Dev

1 つのソース コードが複数のプラットフォーム (デスクトップ、アンドロイド、iOS) をターゲット

分類Dev

あるビューから別のコントローラーのアクションメソッドにルーティングし、そのコントローラーのコンストラクターにパラメーターを渡す

分類Dev

ゲッターの代わりにクラス メンバーへの Const 参照

分類Dev

ユーザープロファイルの代わりにアクティブなリストを介したEtsyAPIターゲットリージョン

分類Dev

コミットまたはロールバックの代わりにMySQLInnoDBのトランザクションをキャンセルする

分類Dev

nullポインタ例外にコピーコンストラクタリードで代わりにゲッターのフィールドに直接アクセスを使用します

分類Dev

ナビゲーションスタックの前のコントローラーに移動します(Swift)

分類Dev

プロットのヒストグラムの代わりにKDEを使用した2D密度コンタープロット

分類Dev

コンストラクターの代わりに個別のロードメソッドを使用するのはなぜですか?

分類Dev

Railsは、データを出力する代わりにハッシュ/配列を生成するコントローラーのロジックを表示します

分類Dev

チェックボックスアラートコントローラー-3つのボタンを追加

分類Dev

ナビゲーションスタック内の以前のビューコントローラの迅速なアクセスプロパティ

分類Dev

macOSタッチバーのコントロールストリップへのプログラム可能なアクセスはありますか?

分類Dev

コンストラクター引数の代わりにブロックを使用してオブジェクトを初期化します

分類Dev

Chromecast-ロック画面/通知/ミニコントローラー-一時停止ボタンの代わりに停止ボタン

分類Dev

MOQオブジェクトのセットアップスコープ/コンテキストがビルダーパターンユニットテストとWebAPIコントローラーで失われる

分類Dev

MOQオブジェクトのセットアップスコープ/コンテキストがビルダーパターンユニットテストとWebAPIコントローラーで失われる

分類Dev

VC#のプロジェクトタイプ(ターゲット)のプリコンパイラーの概念

分類Dev

Try / Catchブロックのコンストラクター

分類Dev

コンストラクターPythonのロジック

分類Dev

複数のフィルターのコントローラーロジック

Related 関連記事

  1. 1

    fxmlローダーからfxmlコントローラーのメソッドにアクセスする

  2. 2

    リロードとエンジンのスプライトの代わりにブラックボックス

  3. 3

    ビューの代わりにコントローラー内でAngularルートスコーププロパティ$ resolveにアクセスします

  4. 4

    ポップアップボックスコントロールの値をコントローラーページに取り込む

  5. 5

    別のコントローラーを押す代わりに、フリップトランジションを使用して新しいナビゲーションスタックを作成する

  6. 6

    クロスプラットフォームコンソールのクリア?

  7. 7

    symfonyでコントローラーの代わりにアクションクラスを使用します

  8. 8

    Angularコンポーネントのゲッターにパラメーターを渡す代わりに

  9. 9

    1 つのソース コードが複数のプラットフォーム (デスクトップ、アンドロイド、iOS) をターゲット

  10. 10

    あるビューから別のコントローラーのアクションメソッドにルーティングし、そのコントローラーのコンストラクターにパラメーターを渡す

  11. 11

    ゲッターの代わりにクラス メンバーへの Const 参照

  12. 12

    ユーザープロファイルの代わりにアクティブなリストを介したEtsyAPIターゲットリージョン

  13. 13

    コミットまたはロールバックの代わりにMySQLInnoDBのトランザクションをキャンセルする

  14. 14

    nullポインタ例外にコピーコンストラクタリードで代わりにゲッターのフィールドに直接アクセスを使用します

  15. 15

    ナビゲーションスタックの前のコントローラーに移動します(Swift)

  16. 16

    プロットのヒストグラムの代わりにKDEを使用した2D密度コンタープロット

  17. 17

    コンストラクターの代わりに個別のロードメソッドを使用するのはなぜですか?

  18. 18

    Railsは、データを出力する代わりにハッシュ/配列を生成するコントローラーのロジックを表示します

  19. 19

    チェックボックスアラートコントローラー-3つのボタンを追加

  20. 20

    ナビゲーションスタック内の以前のビューコントローラの迅速なアクセスプロパティ

  21. 21

    macOSタッチバーのコントロールストリップへのプログラム可能なアクセスはありますか?

  22. 22

    コンストラクター引数の代わりにブロックを使用してオブジェクトを初期化します

  23. 23

    Chromecast-ロック画面/通知/ミニコントローラー-一時停止ボタンの代わりに停止ボタン

  24. 24

    MOQオブジェクトのセットアップスコープ/コンテキストがビルダーパターンユニットテストとWebAPIコントローラーで失われる

  25. 25

    MOQオブジェクトのセットアップスコープ/コンテキストがビルダーパターンユニットテストとWebAPIコントローラーで失われる

  26. 26

    VC#のプロジェクトタイプ(ターゲット)のプリコンパイラーの概念

  27. 27

    Try / Catchブロックのコンストラクター

  28. 28

    コンストラクターPythonのロジック

  29. 29

    複数のフィルターのコントローラーロジック

ホットタグ

アーカイブ