我正在使用 JavaFX 11 和一个新手。
我有一个包含两个场景的单个舞台:一个在开始时显示的主场景和一个在我按下主场景上的某个按钮时切换到并显示的次要场景。在次要场景中,我希望能够在单击窗口右上角的关闭 X 按钮时切换回主场景,而不是关闭整个应用程序。
我目前有一个取消按钮的方法,如下所示:
public void cancelButtonPushed(ActionEvent event) throws IOException {
Parent parent = FXMLLoader.load(getClass().getResource("ExampleMainScreen.fxml"));
Scene scene = new Scene(parent);
Stage window = (Stage) ((Node) event.getSource()).getScene().getWindow();
window.setScene(scene);
window.show();
}
这个方法允许我在按下取消按钮时切换回主场景。但是,当用户单击次要场景上的关闭 X 时,我无法找到任何可以使用的东西。
答案 0 :(得分:3)
首先,正确理解术语,我猜您有两个 Stage
。 Scene
可以显示在那些里面。
其次,Scene Builder(以及它生成的 FXML)不管理阶段,它只构建放置在场景中的节点(以及这些节点的事件处理)。因此,您将找不到与 SceneBuilder 或 FXML 中的窗口关闭功能集成所需的钩子。
第三,当用户想要关闭一个窗口(舞台是一种窗口)时,会发出一个事件,您可以操作onCloseRequest
。
第四,不知何故,您已经设法创建了第二阶段,可能是通过调用 new Stage()
。这将为您提供可设置关闭请求的阶段的参考:
Stage secondaryStage = new Stage();
Stage setScene(secondaryScene);
secondaryStage.setOnCloseRequest(e -> primaryStage.show());
这将显示你的初级阶段(我猜你之前隐藏了它),当次级阶段关闭时,但在它实际关闭之前。
接下来,阅读 Application
lifecycle,具体参见引用 Platform.setImplicitExit(boolean implicitExit)
的部分:
如果此属性为真,JavaFX 运行时将在最后一个窗口关闭时隐式关闭; JavaFX 启动器将调用 Application.stop()
方法并终止 JavaFX 应用程序线程。如果此属性为 false,即使最后一个窗口关闭后,应用程序仍将继续正常运行,直到应用程序调用 exit()
。默认值为 true。
请注意,如果您按照前面概述的方式处理阶段切换,您可能不需要显式设置隐式退出标志,但我会为您提供信息,以防您需要了解它。
最后,考虑您是否真的应该为您的应用程序和这个特定任务创建新的阶段,或者只是替换单个阶段中的内容(类似于网络浏览器的工作方式)。