为何我的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
相关产品推荐
相关产品推荐

