【问题标题】:NullPointerException continuesNullPointerException 继续
【发布时间】:2013-04-13 09:15:27
【问题描述】:

当我尝试从 Panel1 类的 Next JButton 触发动作事件时调用 Panel2 类的 JPanel panel2,我得到 NullPointerException。如何解决这个问题?请帮忙。

public class PanelEventTest
{

/**
 * @param args
 */
JFrame frame;

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

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

public class TestPanel1
{
JPanel panel1;
JButton next;

JPanel panel1()
{
    panel1 = new JPanel();
    next = new JButton("Next");
    next.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e) 
        {
            // TODO Auto-generated method stub
            new TestPanel2().panel2.removeAll();
        }
    });
    panel1.add(next);
    return panel1;
}
}
public class TestPanel2
{
JPanel panel2;
JList jlist;
String[] list = {"Sachin","Tarun","Vipin"};
JPanel panel2()
{
    panel2 = new JPanel();
    jlist = new JList(list);
    panel2.add(jlist);
    panel2.add(new JLabel("Test"));
    return panel2;
}
}

我的最后一个问题Nullpointerexception with JPanel 已经被你们成功解决了。请帮忙。这个例外正在吃我的头。

【问题讨论】:

  • 现在检查答案的代码,我相信它是完整的。
  • 是的,它已经完全解决了。泰人...

标签: java swing nullpointerexception jpanel


【解决方案1】:

如果您尝试更改此行:

new TestPanel2().panel2.removeAll();

收件人:

new TestPanel2().panel2().removeAll();

会解决问题,但目前的逻辑有缺陷。

更好的解决方案是:

TestPanel2 更改为:

public class TestPanel2 {
    JPanel panel2;
    JList jlist;
    String[] list = { "Sachin", "Tarun", "Vipin" };

    public TestPanel2() { // was: JPanel panel2() {
        panel2 = new JPanel();
        jlist = new JList(list);
        panel2.add(jlist);
        panel2.add(new JLabel("Test"));
                      // was: return panel2;
    }
}

然后将TestPanel1修改为:

public class TestPanel1 {
    JPanel panel1;
    JButton next;

    public TestPanel1(final JFrame frame, TestPanel2 tp2) { // was: JPanel panel1() {
        panel1 = new JPanel();
        next = new JButton("Next");
        final JPanel panel2 = tp2.panel2; // line created
        next.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                panel2.removeAll(); // was: new TestPanel2().panel2.removeAll();
                frame.validate(); // line created
                frame.paint(); // line created
            }
        });
        panel1.add(next);
                         // was: return panel1;
    }
}

最后,在PanelEventTest.originalFrame(),更改:

frame.add(new TestPanel1().panel1());
frame.add(new TestPanel2().panel2());

到:

TestPanel2 tp2 = new TestPanel2();
frame.add(new TestPanel1(frame, tp2).panel1);
frame.add(tp2.panel2);
frame.validate();
frame.repaint();

说明

当您需要构造函数时,您正在创建方法。您必须阅读以下内容:Understanding constructors

另外,您需要将TestPanel2frame 传递给TestPanel1

  • 您的代码正在创建一个新的TestPanel2(未附加任何人),然后在其面板上调用removeAll()。这根本没有效果(因为此面板未在任何地方显示)。
  • 更改后的 then 代码将在 TestPanel1 的面板上调用 removeAll()
  • 此外,每次对组件进行更改时,您都需要重新验证/重新绘制组件。
    • 目前,您在创建frame(添加面板)和删除panel2(在“下一步”按钮的操作中)时更改它们。

【讨论】:

  • 非常感谢这个帮助。我所有的问题都得到了解决。给了我非常有用的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2010-10-28
  • 2017-06-15
相关资源
最近更新 更多