好的,所以我正在创建一个Tic Tac Toe GUI。我目前有一个3x3按钮的工作框架,它将改为X或O.我的问题是在按钮顶部实现一个JLabel。标签记录了它的转向,并将从“O转弯”或“X转弯”改变但是我似乎无法让JLabel更新(只有喷口错误)。这是我的代码的一部分,显示了如何实现这一点。该程序运行正常,但只要我添加(turn.setText(“O's turn”);)我就会收到错误。
任何关于为什么这可能不起作用的反馈将不胜感激。
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TicTacToe extends JFrame {
XOButton[] xob = new XOButton[9];
private JLabel turn;
public static int state;
public TicTacToe() {
super("TicTacToe");
//add XOButtons to panel
JPanel center = new JPanel();
state = 0;
JLabel turn = new JLabel("X's turn");
center.setLayout(new GridLayout(3, 3, 2, 2));
//action listener
ButtonListener bl = new ButtonListener();
for (int i = 0; i < 9; i++) {
xob[i] = new XOButton();
xob[i].addActionListener(bl);
center.add(xob[i]);
}
//add panel to frame
setLayout(new BorderLayout());
add(center, BorderLayout.CENTER);
add(turn, BorderLayout.NORTH);
}
//inner action listener class
private class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent ae) {
for (int i = 0; i < 9; i++) {
if(ae.getSource() == xob[i] && xob[i].getState() == XOButton.NONE && state == 0) {
xob[i].setState(XOButton.X);
state = 1;
//turn.setText("O's turn");
} else if(ae.getSource() == xob[i] && xob[i].getState() == XOButton.NONE && state == 1) {
xob[i].setState(XOButton.O);
state = 0;
}
}
}
}
}
答案 0 :(得分:4)
猜猜:您的错误是NullPointerException,因为turn
为空。解决方案:不要遮挡变量。换句话说,您在构造函数中重新声明了turn变量,使该字段为null。
如,
public class TicTacToe extends JFrame{
XOButton[] xob = new XOButton[9];
private JLabel turn;
public static int state;
public TicTacToe() {
super("TicTacToe");
//add XOButtons to panel
JPanel center = new JPanel();
state = 0;
JLabel turn = new JLabel("X's turn"); // **** you're re-declaring turn here!
更好:
public class TicTacToe extends JFrame{
XOButton[] xob = new XOButton[9];
private JLabel turn;
public static int state;
public TicTacToe() {
super("TicTacToe");
//add XOButtons to panel
JPanel center = new JPanel();
state = 0;
turn = new JLabel("X's turn"); // **** Note the difference?
将来,如果您遇到类似的问题,请发布整个错误消息并指出哪一行会引发异常,因为它会对我们有很大的帮助!