You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JavaFX中如何在动画完成后更新balance并延迟场景切换?

解决JavaFX动画未完成就更新balance导致场景提前切换的问题

你遇到的核心问题是动画还在异步执行时,代码同步更新了balance变量,直接触发了场景切换逻辑;而Thread.sleep()wait()之所以报错,是因为它们会阻塞JavaFX的UI线程——UI线程被阻塞时,动画根本无法继续执行,还会导致界面卡顿甚至无响应,这在JavaFX开发中是绝对要避免的操作。

正确思路:利用动画的setOnFinished回调

JavaFX所有动画类(如TransitionAnimationTimer)都提供了setOnFinished()方法,这个回调会在动画正常执行完成时触发;如果是手动调用stop()停止动画,你可以在停止后直接执行更新逻辑。这样就能保证只有动画真正结束后,才会更新balance变量。

下面结合你的代码给出具体修改方案:

1. 组合多个并行动画(统一管理)

如果你有多个同时执行的动画(animation1、animation2、animation3),可以用ParallelTransition把它们组合起来,方便统一监听完成事件:

// 组合所有需要等待的动画
ParallelTransition allAnimations = new ParallelTransition(animation1, animation2, animation3);

// 设置动画完成后的回调
allAnimations.setOnFinished(event -> {
    if (!shapeADone) {
        balance.setValue(-1);
    } else {
        // 假设fadeB()返回对应的动画对象(比如FadeTransition)
        FadeTransition fadeBAnimation = fadeB();
        fadeBAnimation.setOnFinished(fadeEvent -> {
            // 等fadeB动画完成后再更新balance
            balance.setValue(1);
        });
        fadeBAnimation.play();
    }
});

// 启动组合动画
allAnimations.play();

2. 处理碰撞停止动画的场景

在你的碰撞监听逻辑里,停止动画后直接更新balance即可(此时动画已经停止,相当于执行结束):

intersecting.addListener((obs, wasIntersecting, isNowIntersecting) -> {
    System.out.println("Collision!");
    allAnimations.stop(); // 停止组合动画
    balance.setValue(-1); // 动画停止后立即更新balance
});

3. 保留原有场景切换监听逻辑

你主方法里的balance监听逻辑不需要修改,因为现在balance只会在动画真正结束后才更新,场景切换会在正确的时机触发:

level1.balance.addListener(ov -> {
    System.out.println("The new value is " + level1.balance.doubleValue());
    if (level1.balance.getValue() == 1) {
        primaryStage.setScene(scene2);
    }
});

关键注意事项

  • 禁止在UI线程使用Thread.sleep():这会阻塞整个界面,动画、用户交互都会完全停滞。所有需要等待的UI操作,都要用JavaFX的动画回调或者Platform.runLater()(适用于简单延迟执行)。
  • 嵌套动画需链式监听:如果有像fadeB这样的嵌套动画,一定要监听它的完成事件后再更新balance,否则fadeB的动画还没执行完,场景就会提前切换。
  • 动画组合灵活调整:如果你的动画是按顺序执行的,用SequentialTransition代替ParallelTransition即可,同样通过setOnFinished监听整体完成事件。

这样修改后,就能确保所有动画执行完成(或停止)后,才会更新balance变量,进而触发场景切换,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Elif

火山引擎 最新活动