You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java FXML Pokémon同人游戏GUI暂停问题:标签文本更新被跳过

解决JavaFX回合制宝可梦游戏中GUI暂停与文本更新问题

你的核心问题在于按钮点击事件是同步执行的:第一次调用waitForSeconds时虽然修改了Label文本,但后续代码会立刻执行(没有异步等待),导致UI还没来得及刷新显示第一次的文本,后续逻辑就已经推进,看起来像是文本被跳过。另外,Thread.sleep会直接冻结GUI线程,普通Timer/TimerTask则不在JavaFX UI线程执行,容易引发线程安全问题。

用JavaFX原生的PauseTransition就能完美解决,它既不会阻塞UI线程,又能保证所有UI操作在正确的线程上执行。下面是调整后的完整代码逻辑:

public class BattleController implements Initializable {
    @FXML
    private Label lblInfoBattle;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // 场景初始化逻辑
    }
    
    // 点击攻击按钮触发
    public void btnAttackClicked() {
        // 1. 这里保留你判断先手的逻辑,比如速度对比等
        boolean firstPokemonGoesFirst = true; // 示例判断结果
        
        String firstAttackText = firstPokemonGoesFirst ? "我方宝可梦发起攻击!" : "敌方宝可梦发起攻击!";
        String secondAttackText = firstPokemonGoesFirst ? "敌方宝可梦发起攻击!" : "我方宝可梦发起攻击!";

        // 第一步:显示先手攻击文本,等待2秒后执行先手攻击逻辑
        lblInfoBattle.setText(firstAttackText);
        PauseTransition firstPause = new PauseTransition(Duration.seconds(2));
        firstPause.setOnFinished(e -> {
            // 执行先手宝可梦的攻击逻辑(你的原有代码:计算伤害、更新血量等)
            
            // 第二步:显示后手攻击文本,等待2秒后执行后手攻击逻辑
            lblInfoBattle.setText(secondAttackText);
            PauseTransition secondPause = new PauseTransition(Duration.seconds(2));
            secondPause.setOnFinished(ee -> {
                // 执行后手宝可梦的攻击逻辑(你的原有代码)
                
                // 攻击回合结束后的逻辑:检查宝可梦是否昏厥、切换回合等
            });
            secondPause.play();
        });
        firstPause.play();
    }
}

关键说明:

  • 整个流程通过PauseTransition的setOnFinished回调实现链式异步执行,每一步都等待指定时间后再推进下一段逻辑,完全不会阻塞GUI。
  • 所有Label文本更新和游戏逻辑都在JavaFX UI线程执行,避免线程安全问题。
  • 彻底摒弃了同步等待(如Thread.sleep)和非UI线程的定时器,保证游戏运行流畅。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:02:12