为什么getIcon()在setIcon(...)之后没有返回更新的图标?

时间:2016-02-15 22:12:21

标签: java swing icons imageicon tic-tac-toe

我正在使用改进的JButton进行Tic Tac Toe游戏。现在我一直坚持确定是否有人赢了。解决方案看似简单:检查连续三个图标是否相同。当我点击(在游戏中转弯)时,JButton会设置正确的图像(X或O)。但是,当我稍后调用相应按钮的getIcon()来检查是否有赢家时,它会返回" null,"不是我之前设置的图标,即使游戏中的图像看起来很好。我认为问题在于程序处理/运行的顺序;不过,我可能完全错了。感谢任何帮助,谢谢!

代码:

主类:

import javax.swing.*;


public class ticTacToeMain{

    public static void main(String[]args){

        boolean winner = false;

            ticTacToeBoard theBoard = new ticTacToeBoard();
            theBoard.setTitle("Tic Tac Toe");   
            theBoard.setSize(theBoard.getWidth(),theBoard.getHeight());
            theBoard.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            theBoard.setVisible(true);

            winner = theBoard.checkWinner(theBoard.buttons);
            if(winner == true)
                System.exit(0); //I have this only temporarily so that I know if it actually works  
    }

}

董事会成员:

import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridLayout;


public class ticTacToeBoard extends JFrame{

int w = 600;
int h = 600;
int turn = 0;
JPanel panel = new JPanel();
TTTButton buttons[]=new TTTButton[9];

public ticTacToeBoard(){
    panel.setLayout(new GridLayout(3,3));
    for(int i=0; i<9; i++){
        buttons[i]=new TTTButton();
        panel.add(buttons[i]);
    }
    add(panel);
    panel.setVisible(true);
}
public int getWidth(){
    return w;
}
public int getHeight(){
    return h;
}

public boolean checkWinner(TTTButton[]buttonArray){
    if (buttonArray[0].getIcon() == buttonArray[1].getIcon() && buttonArray[0] == buttonArray[2].getIcon() && buttonArray[0] != null)
        return true;
    else if (buttonArray[3].getIcon() == buttonArray[4].getIcon() && buttonArray[3] == buttonArray[5].getIcon() && buttonArray[3] != null)
        return true;
    else if (buttonArray[6].getIcon() == buttonArray[7].getIcon() && buttonArray[6] == buttonArray[8].getIcon() && buttonArray[6] != null)
        return true;
    else if (buttonArray[0].getIcon() == buttonArray[3].getIcon() && buttonArray[0] == buttonArray[6].getIcon() && buttonArray[0] != null)
        return true;
    else if (buttonArray[1].getIcon() == buttonArray[4].getIcon() && buttonArray[0] == buttonArray[7].getIcon() && buttonArray[1] != null)
        return true;
    else if (buttonArray[2].getIcon() == buttonArray[5].getIcon() && buttonArray[0] == buttonArray[8].getIcon() && buttonArray[2] != null)
        return true;
    else if (buttonArray[0].getIcon() == buttonArray[4].getIcon() && buttonArray[0] == buttonArray[8].getIcon() && buttonArray[0] != null)
        return true;
    else if (buttonArray[2].getIcon() == buttonArray[4].getIcon() && buttonArray[0] == buttonArray[6].getIcon() && buttonArray[0] != null)
        return true;
    else
        return false;
}


}

按钮类:

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;


public class TTTButton extends JButton implements ActionListener{

static boolean winner = false;
static int turn = 0;
ImageIcon iconX;
ImageIcon iconO;

    public TTTButton(){
        iconX = new ImageIcon("C:\\Users\\Aaron\\Pictures\\Logo_stx.png");
        iconO = new ImageIcon("C:\\Users\\Aaron\\Pictures\\ohiostateO.jpg");
        this.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e){
        if (turn == 0){
            setIcon(iconX);
            turn+=1;

        }
        else if (turn == 1){
            setIcon(iconO);
            turn-=1;

        }
    }

}

1 个答案:

答案 0 :(得分:2)

您没有在任何事件监听器中调用checkWinner(...),而是在程序创建时只调用一次:

public static void main(String[]args){

    boolean winner = false;

    ticTacToeBoard theBoard = new ticTacToeBoard();
    theBoard.setTitle("Tic Tac Toe");   
    theBoard.setSize(theBoard.getWidth(),theBoard.getHeight());
    theBoard.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    theBoard.setVisible(true);

    winner = theBoard.checkWinner(theBoard.buttons); // **** here ****
}

在此位置所有图标实际上都保证为空 - 它们必须是因为还没有按下任何按钮。

解决方案很简单 - 不要在程序启动时调用此方法,而只是在按钮的ActionListener中调用它。

请注意,尝试沿着M-V-C(模型 - 视图 - 控制器)线构建该程序是一个很好的程序,以尝试将程序逻辑与GUI分离。在学习和减少代码圈复杂度方面,这将是一项值得的练习。