NullPointerException异常在动作侦听器实例化按钮(NullPointerExcep

2019-10-18 11:34发布

下面的代码是一个程序,我正在从空指针异常的一个片段。 当我按下“添加”按钮,在GUI上,指着这一行的错误信息:

  buttonPanel.addButton.setEnabled(false);

被陈列。 我猜Add按钮是无效由于某种原因,我虽然buttonPanel的构造函数实例吧:

 addButton = new JButton("Add");
 addButton.addActionListener(buttonListener);

为什么是空指针错误

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at AddButtonListener.actionPerformed(AddButtonListener.java:21)

出现? 当听众是buttonPanel类的内部编码,程序运行正常,没有错误。 在此先感谢您的帮助!

import java.awt.GridLayout;
import javax.swing.*;

public class ButtonPanel extends JPanel{
    public JButton addButton,
                   editButton,
                   deleteButton,
                   acceptButton,
                   cancelButton,
                   exitButton;

    public JPanel topPanel,
                   exitPanel;

    private ParentFrame parentFrame;

    public static String buttonStatus;

    public ButtonPanel(ParentFrame parent){
        parentFrame = parent;

        buttonStatus = "idle";
        //Create Buttons

        AddButtonListener buttonListener = new AddButtonListener(parent);
        addButton = new JButton("Add");
        addButton.addActionListener(buttonListener);
        editButton = new JButton("Edit");
        deleteButton = new JButton("Delete");
        acceptButton = new JButton("Accept");
        cancelButton = new JButton("Cancel");
        exitButton = new JButton("Exit");

        //Manipulate Buttons
        acceptButton.setEnabled(false);
        cancelButton.setEnabled(false);

        //Add to panels
        topPanel = new JPanel();
        topPanel.add(addButton);
        topPanel.add(editButton);
        topPanel.add(deleteButton);
        topPanel.add(acceptButton);
        topPanel.add(cancelButton);

        exitPanel = new JPanel();
        exitPanel.add(exitButton);

        this.setLayout(new GridLayout(2,1));
        this.add(topPanel);
        this.add(exitPanel);
    }
}

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

public class AddButtonListener implements ActionListener{

    private ParentFrame myFrame;

    private ButtonPanel buttonPanel;

    public AddButtonListener(ParentFrame parent){
        myFrame = parent;
        buttonPanel = parent.buttonPanel;
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        buttonPanel.buttonStatus = "add";

        buttonPanel.addButton.setEnabled(false);
        buttonPanel.editButton.setEnabled(false);
        buttonPanel.deleteButton.setEnabled(false);

        buttonPanel.acceptButton.setEnabled(true);
        buttonPanel.cancelButton.setEnabled(true);
    }

}

import java.awt.BorderLayout;
import javax.swing.JFrame;

public class ParentFrame extends JFrame{

    public ButtonPanel buttonPanel;

    public ParentFrame(){
        this.setResizable(false);

        buttonPanel = new ButtonPanel(this);

        this.add(buttonPanel, BorderLayout.SOUTH);
        this.pack();

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400, 300);
    }

    public static void main(String[] args){
        ParentFrame frame = new ParentFrame();
        frame.setVisible(true);
    }
}

Answer 1:

你buttonpanel要求参考ParentFrame待建。 ButtonPanel被构建在父框架和创建侦听,它引用父框架的按钮面板。

不幸的是,按键面板没有被分配在这一点上,所以你的动作侦听器具有分配给它的按键面板的情况下空值。

我认为这个问题是你的按键面板的实例是在你的空AddButtonListener

你可以通过一个实例ButtonPanel到您解决这个问题AddButtonListener构造。 由于AddButtonListener没有使用ParentFrame ,不打扰通过它在所有。

private ButtonPanel buttonPanel;
public AddButtonListener(ButtonPanel panel){
    myFrame = parent;
    buttonPanel = panel;
}

然后在你的按键面板的构造函数:

public ButtonPanel(ParentFrame parent){
    parentFrame = parent;

    buttonStatus = "idle";
    //Create Buttons

    AddButtonListener buttonListener = new AddButtonListener(this);
    //rest the code

除此之外,你不应该构建这样的事情。 你在做什么是紧密耦合的ButtonPanelParentFrame 。 这意味着,如果你的父母帧之间的变化可能导致的另一个变化ButtonPanel ,这使得少maintanable代码。



Answer 2:

您添加的new AddButtonListener(parent); 在之前ButtonPanel(ParentFrame parent)完全初始化,所以所有的IT成分主要为空。



Answer 3:

执行以下步骤,AddButtonListener

public void actionPerformed(ActionEvent ae) {
    // change all references to buttonPanel to myFrame.buttonPanel
    myFrame.buttonPanel.buttonStatus = "add";
    ...
}

这是因为当你构建ButtonPanel,里面ParentFrame的buttonPanel变量,你绕过是在那一刻空。

看到

public ParentFrame(){
    ...
    // when you initialize this, buttonPanel is null until constructing is complete
    buttonPanel = new ButtonPanel(this);
    ...
}

因此AddButtonListener.buttonPanel为空。



Answer 4:

你可能有删除的初始化代码是:

public yourClass()
{
    initComponents();
    btn(false);
}


文章来源: NullPointerException for instantiated button in action listener