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

为何我的Thread.sleep()未按预期生效?按钮释放后延迟逻辑异常

问题分析与解决

核心问题

你在mouseReleased方法里调用Thread.sleep(400)会直接阻塞Swing事件调度线程(EDT)——所有UI更新操作都依赖这个线程执行。按钮恢复尺寸、切换图标的代码还没来得及渲染到界面,线程就被sleep卡住了,等延迟结束后直接执行移除菜单面板的逻辑,所以看起来释放代码完全没触发。

修复方案

用Swing专属的Timer替代Thread.sleep,它不会阻塞EDT,能让UI先完成更新,再延迟执行游戏启动逻辑:

// 记得导入需要的类:
// import javax.swing.Timer;
// import java.awt.event.ActionEvent;
// import java.awt.event.ActionListener;

@Override
public void mouseReleased(MouseEvent e) {
    // 先执行按钮恢复的UI操作,这部分会立刻被渲染
    startButton.setPreferredSize(new Dimension(256, 256));
    startButton.setIcon(startButtonImage);
    FRAME.pack();

    // 用Swing Timer实现400ms延迟
    new Timer(400, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            // 延迟结束后执行游戏启动逻辑
            FRAME.remove(menuPanel);
            FRAME.revalidate();
            FRAME.repaint();
            // 执行完毕后停止Timer
            ((Timer)evt.getSource()).stop();
        }
    }).start();
}

补充说明

Swing Timer的回调逻辑会在EDT中执行,但启动后不会阻塞当前线程,所以按钮的UI更新能正常显示,等延迟时间到了再触发界面切换,完全符合你想要的流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:07:00