调用stage.close()后如何防止代码执行?

Posted

技术标签:

【中文标题】调用stage.close()后如何防止代码执行?【英文标题】:How to prevent code from executing after calling stage.close()? 【发布时间】:2017-04-14 11:19:49 【问题描述】:

我正在使用 JavaFX。

当某个文件未加载时,我希望该阶段关闭并且该实例中的代码停止执行。

catch (FileNotFoundException ex)

    stage.close();
    System.out.println("This should not appear.");

调用 stage.close() 会关闭程序,但在此之前,程序中的一些其他代码会被执行。我不希望这种情况发生。

如何立即关闭当前阶段(或至少阻止其他代码执行)?

【问题讨论】:

How to close an entire JavaFX application?的可能重复 @limonik - 我不想关闭整个应用程序。我只想关闭当前阶段。 您说:“我要关闭舞台,停止执行程序。”。那么你真正想要达到的目标是什么?执行的“其他一些代码”是什么? @DVarga- 我可能没有使用正确的术语,但基本上,我的程序从一个阶段开始。该阶段产生另一个阶段。我希望第二阶段退出而不影响第一阶段,我希望它退出而不继续调用更多代码。 【参考方案1】:

使用stage.setOnCloseRequest 在舞台关闭前执行操作。喜欢

 public void start(Stage primaryStage)
 
       // do all the regular stuff.
       primaryStage.setOnCloseRequest(E -> 
            // perform actions before closing
       );
 

在 Application 类中覆盖 stop() 方法也是添加关闭挂钩的有效方法。虽然从经验来看,它并不总是在您的应用程序关闭时被调用。

最后,如果您想关闭整个应用程序,请使用Platform.exit()(静态方法)。 stage.close()方法等于stage.hide(),意思是只有窗口会被隐藏,应用程序不会关闭。

编辑1:

如果您想在舞台隐藏时执行代码。使用以下代码段。

 primaryStage.setOnHiding(E -> 
      // perform actions upon hiding.
 );

EDIT2:

如果您希望第一个阶段等待第二个阶段,并在第二个阶段关闭后继续使用secondaryStage.showAndWait()。这样,如果您想在第一个 Stage 上继续执行,您只需关闭辅助 Stage。

【讨论】:

我已经尝试过 Platform.exit,但它关闭的不仅仅是当前阶段。它也关闭了其他阶段。它也不会阻止它之后的代码。 我创建第二阶段的方式是使用Application game = gameType.newInstance();阶段 newStage = new Stage(); game.start(newStage);` 我不认为 showAndWait 会在那里工作,因为游戏对象正在创建自己的舞台。 您创建了 2 个应用程序类实例?那是个坏主意。只使用一个,第二阶段使用newStage.showAndWait()。它会给出你需要的结果。 也许我在这里遗漏了一些东西,但是如果您总是希望在抛出 FileNotFoundException 时关闭舞台,为什么要将一些您永远不想执行的代码放在 catch 块中?将阶段关闭时不想执行的所有代码放在try 块中,然后将stage.close() 语句放在catch 块中。这样try块中的代码只有在没有抛出异常的情况下才会被执行。

以上是关于调用stage.close()后如何防止代码执行?的主要内容,如果未能解决你的问题,请参考以下文章

防止多次 Ajax 更新

如何防止 Ajax 调用使会话保持活动状态?

如何防止芹菜执行相同的任务?

通过代码关闭 fxml 窗口,javafx

如何防止ajax调用两次触发

如何防止代码被反编译