java - Action 监听器中实例化按钮的 NullPointerException

标签 java exception nullpointerexception jbutton actionevent

以下代码是我从中获取空指针异常的程序片段。当我按下 GUI 上的“添加”按钮时,一条指向此行的错误消息:

  buttonPanel.addButton.setEnabled(false);

显示。尽管我在 buttonPanel 的构造函数中实例化了它,但出于某种原因我猜测 addButton 为空:

 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);
    }
}

最佳答案

您的按钮面板需要引用 ParentFrame 才能构建。 ButtonPanel 在父框架中构建并创建一个监听器,它引用父框架的按钮面板。

不幸的是,此时尚未分配按钮面板,因此您的 Action 监听器将空值分配给其按钮面板实例。

我认为问题在于您的 AddButtonListener 中的按钮面板实例为 null。

您可以通过将 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

此外,您不应该像这样构建事物。您正在做的是将您的 ButtonPanel 与您的 ParentFrame 紧密耦合。这意味着如果您的父框架发生变化,它可能会导致 ButtonPanel 发生另一次变化,从而减少代码的可维护性。

关于java - Action 监听器中实例化按钮的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18193308/

相关文章:

java - JavaFX 中现有 java bean 的异步绑定(bind)

java - 按计数过滤 Guava HashMultimap 键

c++ - 未定义对 _Unwind_Resume 和 __gxx_personality_v0 的引用

java - 将受检异常与 java.util.function.Predicate 一起使用

c++ - 如何在禁用异常的情况下检查构造函数的失败

java - 如何防止将用户输入添加到 MPandroidchart 时出现 java.lang.nullpointerException

java - 如何在JAVA类中填充数组

java - 在调用方法之前检查非空实际值时出现 NullPointerException

java - 基本 REST Web 服务无法注册

java - 当他访问网站并以用户语言显示页面时,如何在jsp页面中获取用户语言环境