我知道这不是您想要的答案,但 IMO 提出的解决方案并不好(而且您自己的方式是)。为什么?因为它们取决于应用程序状态。在 JavaFX 中,控件、场景和舞台不相互依赖。这意味着控件可以在不添加到场景的情况下存在,并且场景可以在不附加到舞台的情况下存在。然后,在时刻 t1,控制可以附加到场景,并且在时刻 t2,可以将场景添加到舞台(这解释了为什么它们是彼此可观察的属性)。
因此,建议获取控制器引用并调用方法,将阶段传递给它的方法会为您的应用程序添加一个状态。这意味着您需要在创建阶段之后的正确时刻调用该方法。换句话说,您现在需要遵循一个顺序: 1- 创建阶段 2- 通过方法将创建的阶段传递给控制器。
在这种方法中,您不能(或不应该)更改此顺序。所以你失去了无国籍状态。在软件中,一般来说,状态是邪恶的。理想情况下,方法不应要求任何调用顺序。
那么什么是正确的解决方案?有两种选择:
1-您的方法,在控制器侦听属性中获得舞台。我认为这是正确的做法。像这样:
pane.sceneProperty().addListener((observableScene, oldScene, newScene) -> {
if (oldScene == null && newScene != null) {
// scene is set for the first time. Now its the time to listen stage changes.
newScene.windowProperty().addListener((observableWindow, oldWindow, newWindow) -> {
if (oldWindow == null && newWindow != null) {
// stage is set. now is the right time to do whatever we need to the stage in the controller.
((Stage) newWindow).maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
}
});
}
});
2-您在创建的地方做您需要做的事情Stage
(这不是您想要的):
Stage stage = new Stage();
stage.maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
stage.setScene(someScene);
...