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

标签 java swing icons imageicon tic-tac-toe

我正在使用修改后的 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 中调用它。

请注意,这个程序将是一个很好的尝试沿着 M-V-C(模型- View - Controller )线构建的程序,尝试将程序逻辑与 GUI 分开。就学习和降低代码圈复杂度而言,这将是一次值得的练习。

关于java - 为什么 getIcon() 在 setIcon(...) 之后不返回更新的图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35420060/

相关文章:

java - 如何生成 Java 对象生命周期的直方图

java - 由于缺少 EmbeddedServletContainerFactory bean,Spring 应用程序无法启动

java - 为什么 Java(在一个特定的安装上)认为我是自签名的?

java - 如何在java中更改JScrollPane的大小

java - 如果 `set setOpaque(false);`,JWindow 上的 JPanel 不透明 - 为什么?

java - 如何编辑可更改的图标比例?

java - FLAG_NOT_FOCUSABLE Activity

java - 如何在java swing应用程序中保留和删除多个图形对象?

c# - Xamarin Android - 自定义通知托盘图标(状态栏)

android - 设备上应用程序图标下缺少应用程序标题