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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:41:50