当我尝试在actionPerformed方法中调用panel2时,我得到了nullpointerexception。请帮助我摆脱这个愚蠢的问题。

public class PanelEventTest implements ActionListener {
    /**
     * @param args
     */
     JFrame frame;
     JPanel panel1, panel2;
     String[] list = {"Sachin","Tarun","Vipin"};
     JList jlist;
     JButton next;

     void originalFrame()
     {
         frame = new JFrame();
         frame.setSize(500, 300);
         frame.setVisible(true);
         frame.setLayout(new FlowLayout());
         frame.add(panel1());
         frame.add(panel2());
     }

     JPanel panel1()
     {
         panel1 = new JPanel();
         next = new JButton("Next");
         next.addActionListener(new PanelEventTest());
         panel1.add(next);
         return panel1;
     }

    JPanel panel2()
    {
         panel2 = new JPanel();
         jlist = new JList(list);
         panel2.add(jlist);
         panel2.add(new JLabel("Test"));
         return panel2;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new PanelEventTest().originalFrame();
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if(e.getActionCommand() == "Next")
        {
            panel2.removeAll();
        }
    }
 }


动作事件未与panel2关联,这是该异常背后的原因吗?

最佳答案

代替

next.addActionListener(new PanelEventTest());


你应该有

next.addActionListener(this);


否则,事件监听器将是PanelEventTest的另一个实例,该实例的originalFrame()方法从未被调用过,因此其panel2变量为null。 (请注意,即使调用了其originalFrame()方法,它也会从其自己的panel2中而不是从包含按钮的框架的panel2中删除所有内容)。

您应该更喜欢为侦听器使用(匿名)内部类,而不是使框架本身成为侦听器:

next.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        panel2.removeAll();
    }
});

10-05 18:28