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();
root
ID(fx:idではない)を指定したにもかかわらず、でborderPaneを検索するとnullが返されます。だから私の質問は、代わりにborderPaneのゲッターを書いて、代わりにこのようなことをすることは許容されgameManagerController
ますか?
gameManagerController.getBorderPane().setTop(topMenuBar);
通常、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]
コメントを追加