Java Swing Yahtzee程序:GUI更新间添加暂停以展示CPU掷骰过程
解决Swing中CPU三次掷骰子的分步显示问题
核心思路
使用重复的Swing Timer,配合计数器记录掷骰次数,每次触发时更新骰子状态并刷新GUI,完成三次后停止Timer。这样既不会阻塞EDT(事件调度线程),又能按顺序显示每次掷骰的结果。
实现代码
// 定义计数器,记录已完成的掷骰次数 private int cpuRollCount = 0; private Timer cpuTurnTimer; // 启动CPU回合的方法 private void startCPUTurn() { cpuRollCount = 0; // 重置计数器 // 创建重复的Timer,间隔3秒 cpuTurnTimer = new Timer(3000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { cpuRollCount++; // 执行掷骰逻辑(替换为你的实际代码) rollCPUDice(); // 更新GUI contentPane.validate(); contentPane.repaint(); // 检查是否完成三次掷骰 if (cpuRollCount >= 3) { cpuTurnTimer.stop(); // 停止Timer // 可在此处理CPU回合结束后的逻辑,比如计算得分 } } }); // 立即执行第一次掷骰(若需第一次也等待3秒,可将初始延迟设为3000) cpuTurnTimer.setInitialDelay(0); cpuTurnTimer.start(); } // 示例掷骰方法 private void rollCPUDice() { // 写入你的骰子随机生成逻辑 System.out.println("CPU第" + cpuRollCount + "次掷骰"); }
关键细节
- 计数器控制:通过
cpuRollCount变量跟踪已完成的掷骰次数,达到3次时停止Timer - EDT安全:Swing Timer的
actionPerformed方法在EDT中执行,所有GUI更新操作均安全,不会导致界面冻结或跳过更新 - 状态重置:每次启动CPU回合前重置计数器,避免多次触发导致计数混乱
注意事项
- 启动新的CPU回合前,需停止之前可能仍在运行的Timer,避免逻辑冲突
- 若需遵循Yahtzee规则保留部分骰子,可在每次掷骰前标记需重掷的骰子,仅更新对应骰子的状态
内容的提问来源于stack exchange,提问作者JavaNewb31
相关产品推荐
相关产品推荐

