在ActionEvent中更改JLabel的文本

时间:2015-04-27 23:55:43

标签: java swing nullpointerexception jlabel

好的,所以我正在创建一个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;
                }
            }
        }
    }
}

1 个答案:

答案 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?

将来,如果您遇到类似的问题,请发布整个错误消息并指出哪一行会引发异常,因为它会对我们有很大的帮助!