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

我正在使用 JavaFX。

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

catch (FileNotFoundException ex)
{
    stage.close();
    System.out.println("This should not appear.");
}

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

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

【问题讨论】:

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

标签: java javafx


【解决方案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块中的代码只有在没有抛出异常的情况下才会被执行。
猜你喜欢
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
相关资源
最近更新 更多