![](/img/trans.png)
[英]How to change icon size of UIManager.getIcon("OptionPane.errorIcon)?
[英]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.