Java GUI记忆游戏问题:点击非配对卡片时第二张卡片不显示
问题分析与解决方案
嘿,我一眼就看出问题出在哪了!你现在用Thread.sleep(1000)阻塞了Swing的事件调度线程(EDT)——这可是Swing UI更新的核心线程啊!
当你点击第二张不同的卡片时,代码先设置了它的图标,但还没等这个UI更新被渲染到屏幕上,线程就进入休眠了。这1秒里整个UI都卡住不动,等休眠结束,你直接把两张卡片都翻回背面,所以看起来第二张卡片根本没显示过。而配对成功的时候不需要休眠,UI能及时更新,所以一切正常。
正确的做法:用Swing Timer替代Thread.sleep
Swing提供了javax.swing.Timer,它能在指定延迟后触发任务,而且不会阻塞EDT,完美解决这个问题。下面是修改后的代码片段:
final int copy = i; card2.addActionListener((e) -> { card2.setIcon(new ImageIcon(icons[copy].getAbsolutePath())); if (firstClick == null) { firstClick = (Card) e.getSource(); } else { Card secondClick = (Card) e.getSource(); if (firstClick.getID() != secondClick.getID()) { // 创建一个1秒后触发的Timer Timer timer = new Timer(1000, timerEvent -> { // 在这里执行翻回背面的操作 firstClick.setIcon(new ImageIcon(background.getAbsolutePath())); secondClick.setIcon(new ImageIcon(background.getAbsolutePath())); firstClick = null; // 执行完任务后停止Timer ((Timer) timerEvent.getSource()).stop(); }); // 设置只执行一次 timer.setRepeats(false); timer.start(); } else { firstClick = null; } } });
额外提示
- 记得在使用Timer前导入
javax.swing.Timer类 - 可以考虑在Timer运行期间禁用所有卡片的点击事件,避免用户重复点击导致逻辑混乱——比如加个
isProcessing布尔变量,Timer运行时设为true,结束后设为false,点击事件里先判断这个变量再执行逻辑。
内容的提问来源于stack exchange,提问作者Tami
相关产品推荐
相关产品推荐

