for循环在第一个循环后无法正常工作

时间:2018-06-21 19:31:44

标签: java swing for-loop

我希望使用Swing创建一个简单的TicTacToe GUI游戏; 我创建了名为TicTacToe的JFrame,并使用gamePanel将JPanel放入了名为GridLayout(3,3)的JPanel中。然后,我为按钮创建了一个名为buttons[][]的按钮数组,在其中放置了XO的图标。然后我生成了9个按钮, 增加了逻辑。 JPanel代码:

public class gamePanel extends JPanel {
XOButton buttons[][] = new XOButton[3][3];
boolean isX;
public gamePanel() {
    setLayout(new GridLayout(3, 3));
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++) {
            buttons[i][j] = new XOButton();
            buttons[i][j].setIcon(null);
            add(buttons[i][j]);
        }
    }
    isX = true;
}

private class XOButton extends JButton {
    ImageIcon X, O;

    public XOButton() {
        X = new ImageIcon(gamePanel.this.getClass().getResource("X.png"));
        O = new ImageIcon(gamePanel.this.getClass().getResource("O.png"));
        addActionListener(this::actionPerformed);
    }

    public int getValue(XOButton btn){
        if(btn.getIcon().toString().equals(null)){
            return 0;
        }
        if(btn.getIcon().toString().equals(X.toString())){
            return 1;
        }
        if(btn.getIcon().toString().equals(O.toString())){
            return 2;
        }
        return 0;
    }

    public void actionPerformed(ActionEvent e) {
        if(getIcon() != null) return;
            if (isX) {
                setIcon(X);
                isX = false;
                checkWinner();
            } else {
                setIcon(O);
                isX = true;
                checkWinner();
            }
    }

    public void checkWinner(){
            for(int i = 0; i < 3; i++){
            if(getValue(buttons[i][0]) != 0 && getValue(buttons[i][0]) == getValue(buttons[i][1])
                && getValue(buttons[i][1]) == (getValue(buttons[i][2]))) {
                if (getValue(buttons[i][0]) == 1) {
                    JOptionPane.showMessageDialog(null, X);
                    return;
                } else if (getValue(buttons[i][0]) == 2) {
                    JOptionPane.showMessageDialog(null, O);
                    return;
                }
            }
        }
    }
}

}

我想知道我是否可以解决这个问题(请!): 如您所见,我创建了名为checkWinner的过程,但它仅检查按钮图标是否在一行中相等。但是,当我使用此代码时,它仅适用于第一行。第二个和第三个都将忽略,直到我填充第一行的前两个按钮。当代码有效时,它应该显示带有X或O图像的消息(取决于谁是获胜者)。 Image where it works fine in the first rowImage where it is not working (until I will fill first row for a half) 当我在第二张图片中填充第一行时,它将同时显示两个messageDialogsX图片。

我在做什么错? 我还要感谢有关我的代码的答案和评论,这太糟糕了,我想提高自己的技能。 感谢您的关注。

编辑:按下任何按钮时都会出现此异常:

O

`

2 个答案:

答案 0 :(得分:2)

在getValue中:

btn.getIcon().toString().equals(null)
对于未单击的按钮,

btn.getIcon()为null。 因此,toString()会引发一个NPE。

尝试将其更改为

if(btn.getIcon() != null)

与其他if相同

if(btn.getIcon() != null && btn.getIcon().equals(X))

代替

 if(btn.getIcon().toString().equals(X.toString()))

答案 1 :(得分:0)

getValue(XOButton btn)这一行

if(btn.getIcon().toString().equals(null))

如果尚未设置图标,则抛出NullPointerException。

仅在单击按钮时才设置图标。

用{p>替换您在getValue(XOButton btn)中的第一个条件

    if(btn.getIcon() == null){
        return 0;
    }

如果已设置图标(其他两种情况)将不是NullPointerException。