【问题标题】:setting jLabel text in java throws exception [duplicate]在java中设置jLabel文本会引发异常[重复]
【发布时间】:2013-01-28 02:52:11
【问题描述】:

我正在用 Java 实现井字游戏,但是当我运行程序并按下按钮时, 由于我的点击方法而发生了异常。不知何故,JLabel 似乎从未被初始化过。为什么?

package piskvorky;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Piskvorky extends JFrame {
    String[] tahy = {"O", "X"};
    int tah = 0;
    JButton[][] buttons;
    JLabel stav;
    int x, y;

    public Piskvorky(int x, int y) {
        this.x = x;
        this.y = y;

        setTitle("Piskvorky");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridLayout(x, y+1));

        JButton[][] buttons = new JButton[x][y];

        for (int i = 0; i < x; ++i) {
            for (int j = 0; j < y; ++j) {
                buttons[i][j] = new JButton();
                buttons[i][j].setPreferredSize(new Dimension(50, 50));
                buttons[i][j].addActionListener(new MyTextListener());
                add(buttons[i][j]);
            }
        }

        JLabel stav = new JLabel();
        add(stav);

        pack();
    }

    class MyTextListener implements ActionListener{
        public void actionPerformed(ActionEvent e) {
            JButton kliknute = (JButton) e.getSource();
            setProperties(kliknute);
        }
    };

    private void setProperties(JButton source)
    {
        source.setText(tahy[tah]);
        source.setEnabled(false);
        tah = 1-tah;
        if(tah == 0)
            stav.setText("Current player: o");
        else
            stav.setText("Current player: x");
    }

    public static void main(String[] args) {
        new Piskvorky(10, 10).setVisible(true);
    }

}

【问题讨论】:

  • JButton[][] 按钮 = 新的 JButton[x][y];重新声明字段。
  • @imx:Ayyyy,他隐藏的变量不仅仅是 stav。
  • 空指针操作是 'stav.setText(...)'。您不应重新声明“stav”字段。 "JLabel stav = new JLabel();"
  • 复制/粘贴错误和异常输出而不是解释它。

标签: java swing jlabel


【解决方案1】:

您通过在构造函数中重新声明它来隐藏 stav 变量,所以是的 stav 类字段为空。解决方案:可以,在构造函数中初始化 stav 但不要在那里重新声明。

编辑:根据 imxylz 的评论,您也在隐藏其他变量。是时候了解变量阴影了。请查看有关此内容的 Wikipedia 文章或 Google 文章,因为这是一个重要的概念,需要了解并了解如何避免。

【讨论】:

    【解决方案2】:
    JLabel stav = new JLabel();
    

    上面的行表示本地声明。但你正在使用,

    stav.setText("Current player: o");
    

    setProperties 方法中。所以你得到一个NPE。删除那里的 reclration 并使用 stav 作为实例变量而不是局部变量。删除 stav 的本地声明后,它对我来说很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多