gpt4 book ai didi

java - Controller 类中 FXML Controller 的 Getters 而不是查找?

转载 作者:行者123 更新时间:2023-11-30 02:48:50 25 4
gpt4 key购买 nike

我正在 start() 中加载 fxml,我想将它们放置在有 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 中查找 borderPane 返回 null,即使我确实给了它一个 id(不是 fx:id)。所以我的问题是,在 gameManagerController 中为 borderPane 编写 getter 并执行类似的操作是否可以接受?

gameManagerController.getBorderPane().setTop(topMenuBar);

最佳答案

在 Controller 外部公开 UI 元素通常不是一个好主意。这样做会使以后更改组织 UI 的方式变得更加困难,因为您可能在 Controller -FXML 对外部有依赖于特定布局或存在的特定 UI 元素类的代码。

一个简单但更强大的解决方案是定义一个方法,用于在 GameController 中显示菜单:

public class GameController {

@FXML
private BorderPane rootPane ;

// ...

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

// ...
}

现在你可以做

gameManagerController.showMenu(topMenuBar);
<小时/>

一种更复杂的方法是使用“ View 模型”来表示应用程序的 View 状态,这种方法对于这种情况可能有点过分,但仍然值得一看。

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);
}

// ...
}

现在您可以在 Controller 之间共享 View 模型的单个实例, Controller 可以根据需要观察和更新状态:

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);

这种方法的优点是它为任何 Controller 提供了一种更新应用程序其他部分中的 UI 的机制,而无需“了解”其他 Controller 。这有助于解耦 UI 的各个部分。缺点是应用程序的复杂性增加 - 可能很难调试,因为不太清楚 UI 中发生的不同事情。

关于java - Controller 类中 FXML Controller 的 Getters 而不是查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39330593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com