繁体   English   中英

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

[英]Why is getIcon() not returning the updated icon after setIcon(…)?

我正在使用修改后的JButtons制作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;

        }
    }

}

您不是在任何事件侦听器中调用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中调用它。

请注意,该程序非常适合尝试沿着MVC(模型-视图-控制器)行进行结构化,并尝试将程序逻辑与GUI分开。 在学习和减少代码循环复杂性方面,这将是一个值得的练习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM