【发布时间】:2016-09-05 12:25:24
【问题描述】:
我正在start() 中加载 fxmls,我想将它们放置在具有边框窗格的主窗口中。
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);
【问题讨论】:
-
从控制器中公开 UI 元素通常不是一个好主意(尽管它可能比使用非常脆弱的查找更好)。至少,在
GameController中定义一个方法来显示菜单,这样您就可以调用gameManagerController.showMenu(topMenuBar)(将方法命名为适当的名称)。您也可以考虑使用“视图模型”,但在这种情况下可能有点过头了。 -
showMenu()会做什么?它会这样做吗:BorderPane.setTop(topMenuBar);? @James_D -
我会用控制器中更合适的字段名称替换
BorderPane,但是是的,这就是想法。关键是,如果您决定更改布局的管理方式,所有更改都仅限于控制器和 FXML,您无需更改除此之外的代码。使用您建议的解决方案,如果您以后需要,维护或更改您的 UI 会变得更加困难。 -
当然,我对所有内容都使用有意义的名称。我现在明白了,再次感谢。 @James_D
标签: java javafx java-8 javafx-8