以下代码是我从中获取空指针异常的程序片段。当我按下 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/