【问题标题】:Switching To Primary Scene When Secondary Scene Is Closed次要场景关闭时切换到主要场景
【发布时间】:2021-07-28 20:53:46
【问题描述】:

我正在使用 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 时,我无法找到可以使用的东西。

【问题讨论】:

  • 为了获得更好的帮助,请提供minimal reproducible example,否则(正如您在我当前的回答中可能注意到的那样),任何想要回答的人都必须对您正在做什么或希望做什么做出很多假设,并且这些假设可能不准确或不适用。

标签: javafx scenebuilder scene


【解决方案1】:

首先,正确使用术语,我猜你有两个Stages。 Scenes 可以显示在里面。

其次,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。

请注意,如果您如前所述处理阶段切换,您可能不需要显式设置隐式退出标志,但我会为您提供信息,以防您需要了解它。

最后,考虑一下您是否真的应该为您的应用程序和此特定任务创建新阶段,或者只是在单个阶段中替换内容(类似于网络浏览器的工作方式)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多