1

次のコードは、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

4 に答える 4

2

ボタンパネルを構築するには参照が必要ParentFrameです。ButtonPanel親フレームで構築され、親フレームのボタン パネルを参照するリスナーを作成しています。

残念ながら、その時点ではボタン パネルが割り当てられていないため、アクション リスナーのボタン パネルのインスタンスには null 値が割り当てられています。

問題は、ボタン パネルのインスタンスが null にあることだと思います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、 で別の変更が発生する可能性があることを意味します。これにより、コードの保守性が低下します。

于 2013-08-12T17:49:53.663 に答える
1

new AddButtonListener(parent);が完全に初期化される前にを追加しているButtonPanel(ParentFrame parent)ため、すべてのコンポーネントが null になります。

于 2013-08-12T17:50:48.693 に答える