【问题标题】:AnimationTimer - showAndWait is not allowed during animation processingAnimationTimer - 动画处理期间不允许使用 showAndWait
【发布时间】:2017-11-28 06:08:11
【问题描述】:

当玩家赢得我创建的游戏时,我试图显示一个警告对话框。但是,我得到一个例外:

java.lang.IllegalStateException: showAndWait is not allowed during animation or layout processing

我尝试在AnimationTimer 中添加stop(),但它不起作用,仍然抛出相同的异常:

if (ball.getBall().getCenterY() == 0) {
                //computer lost!
                stop();

                Alert alert = new Alert(Alert.AlertType.INFORMATION);
                alert.setTitle(null);
                alert.setHeaderText(null);
                alert.setContentText("Good game. You won! Click OK to exit.");

                alert.showAndWait(); //exception thrown here
                System.exit(0);
            }

【问题讨论】:

  • 异常与描述的完全相同:您不能从动画中调用showAndWait()。这在Alert 文档中没有明确提及,但在Stage documentation 的文档中。
  • @James_D 好的。有解决方法吗?如何停止计时器,然后告诉玩家他们赢了?
  • 我添加了一个应该可行的解决方法的答案。

标签: java animation exception javafx


【解决方案1】:

另一种方法是将您的代码放入私有方法中,并使用方法引用或在 Platform.runLater() 调用中可运行的 lambda 进行调用。

Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle(null);
alert.setHeaderText(null);
alert.setContentText("Good game. You won! Click OK to exit.");

alert.showAndWait(); //exception thrown here
System.exit(0);

这会使对话框在计时器周期之外弹出,应该可以解决问题。

【讨论】:

    【解决方案2】:

    您只能在事件处理程序中调用showAndWait(),而不是在动画中。这在Alert 类中没有明确记录,尽管它记录在documentation for Stage 中。

    改为调用show(),并使用onHidden 事件的处理程序让警报在警报关闭时调用某些内容:

    if (ball.getBall().getCenterY() == 0) {
        //computer lost!
    
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle(null);
        alert.setHeaderText(null);
        alert.setContentText("Good game. You won! Click OK to exit.");
    
        alert.setOnHidden(evt -> Platform.exit());
    
        alert.show(); 
    }
    

    【讨论】:

    • 谢谢,这很好用。你能解释一下evt -> Platform.exit()是什么意思吗?
    • @Stardust 我不确定你的意思。它只是事件的处理程序。 Platform.exit()是退出JavaFX的方法,这只是意味着当hidden事件发生在警报上时执行(即警报关闭)。
    • 哦,只是我没有看到那个符号(->
    • 这是一个 lambda 表达式。它们是在三年多前的 Java 8 中引入的......
    • 我通常让我的 IDE 自动完成我的语句,从现在开始将使用 lambda,因为它们看起来更简单、更容易理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多