NullPointerException用于动作侦听器中的实例化按钮

时间:2013-08-12 17:43:56

标签: java exception nullpointerexception jbutton actionevent

以下代码是程序的片段我从中获取nullpointer异常。当我按下"添加" GUI上的按钮,指向此行的错误消息:

  buttonPanel.addButton.setEnabled(false);
显示

。虽然我在buttonPanel的构造函数中实例化了它,但我猜测addButton由于某种原因是null:

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

4 个答案:

答案 0 :(得分:2)

您的按钮面板需要引用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中的其他更改,这会使代码更少。

答案 1 :(得分:1)

您在new AddButtonListener(parent);完全初始化之前添加ButtonPanel(ParentFrame parent),因此所有组件都为空。

答案 2 :(得分:1)

执行以下操作 在AddButtonListener

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

这是因为在构造ButtonPanel时,您传递的ParentFrame内的buttonPanel变量在此刻为null。

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

因此AddButtonListener.buttonPanel为空。

答案 3 :(得分:1)

您可能已经删除了以下初始化代码:

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