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

Java GUI卡牌游戏:如何遍历JButton数组判断按钮是否被点击?

Java GUI卡牌游戏:手牌按钮点击判断失效问题解决

问题场景

开发Java GUI卡牌游戏时,尝试遍历手牌对应的JButton数组handButtons判断按钮是否被点击,但点击手牌按钮后,控制台仅反复打印"a",从未进入e.getSource() == handButtons[i]的判断分支,无法执行后续合法出牌逻辑。

问题根源

原代码把手牌按钮的点击检测逻辑完全嵌套在e.getSource() == startButton的条件分支内:

  • 点击手牌按钮时,e.getSource()指向的是手牌按钮实例,不会进入startButton的处理分支,因此遍历handButtons的代码根本不会执行。
  • 控制台打印的"a"实际是点击startButton时触发的循环输出,和手牌按钮的点击操作无关。

解决方法

将手牌按钮的点击判断逻辑从startButton的分支中移出,单独作为独立的判断分支,确保点击手牌按钮时能触发对应的检测逻辑。

修正后的代码示例

@Override
public void actionPerformed(ActionEvent e) 
{   
    int pIndex; 
    // 处理开始按钮的点击事件
    if (e.getSource() == startButton)
    {
        pIndex = whoGoesFirst();
        Trick t = new Trick(players[pIndex], cardsInTrick);
        // 保留startButton对应的初始化或开局逻辑
    }
    // 处理手牌按钮的点击事件
    else
    {
        // 替换为实际获取当前出牌玩家索引的逻辑(比如维护全局变量记录当前轮到的玩家)
        int currentPlayerIndex = getCurrentPlayerIndex();
        Trick t = new Trick(players[currentPlayerIndex], cardsInTrick);
        
        for (int i = 0; i < handButtons.length; i++)
        {
            if (e.getSource() == handButtons[i]) 
            {
                System.out.println("b");
                if (t.isLegal(players[currentPlayerIndex], players[currentPlayerIndex].getHand().get(i)))
                {
                    System.out.println("c");
                    trickCardSlots[currentPlayerIndex].setIcon((ImageIcon) handButtons[i].getIcon());
                }
                break; // 找到匹配按钮后跳出循环,提升效率
            }
        }
    }    
}

额外优化提示

  • 遍历handButtons时,找到匹配按钮后直接break退出循环,无需遍历剩余按钮。
  • 建议维护全局变量记录当前轮到出牌的玩家索引,避免重复初始化或错误获取玩家信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:32:32