以下代码是程序的片段我从中获取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);
}
}
答案 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
除此之外,你不应该构建这样的东西。您正在做的是将ButtonPanel
与ParentFrame
紧密结合。这意味着如果您的父框架发生更改,则可能会导致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);
}