使用java swing删除导致NullPointerException的窗格

时间:2014-06-16 15:28:32

标签: java swing nullpointerexception jframe jpanel

我正在尝试清除一个窗格,并在其位置放置一个新窗格。但是使用我当前的设置,它会抛出一个我不明白的NullPointerException。这是我的代码:

public static void createAndShowGUI() {
    final JFrame frame = new JFrame("Generator");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel pane1 = new JPanel();
    JPanel pane2 = new JPanel();

    addComponentsToPane(frame.getContentPane(), pane1, pane2);

    frame.setLocationRelativeTo(null);
    frame.pack();
    frame.setVisible(true);
}

我在addComponentsToPane中有一个按钮的actionlistener:

    buttonGenerate.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent evt){
            Map<String,String> replacements = new HashMap<String,String>(10);
            replacements.put("name", textName.getText());

            //createTable();
            //makeDocx(replacements);
            removePane();
        }
    });

这是removePane()函数:

    public static void removePane () {
    pane1.removeAll();
}

pane1已在类的开头声明为public static JPanel pane1 = null;。当我单击带有actionlistener的按钮时,它会向Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException投掷pane1.removeAll();

为什么会出现此错误?我知道有一些重要的东西我不知道,有没有人知道它是什么或知道另一种方法来实现我想要的东西?

由于

3 个答案:

答案 0 :(得分:4)

不要使用静态变量和方法。这不是设计GUI的方法。

也许从How to Use Buttons上的Swing教程中的ButtonDemo这样的简单示例开始。然后,将instance变量添加到可以从侦听器访问的类中。

  

现在当我点击删除窗格的按钮时,它只是停留在点击位置,没有任何反应

将组件移除(或添加)到可见GUI时,基本代码为:

panel.remove();
panel.revalidate(); // to invoke the layout manager
panel.repaint(); // sometimes needed to force a repaint of the panel

答案 1 :(得分:3)

通过做:

JPanel pane1 = new JPanel();

您正在createAndShowGUI中创建名为pane1的第二个局部变量。您没有使用定义为static的全局变量。那一个仍然是空的。你应该像这样创建它:

pane1 = new JPanel();

答案 2 :(得分:3)

如果pane1是静态变量,那么您应该在createAndShowGUI()方法中引用它。您错误地创建了新的本地引用:

public static void createAndShowGUI() {
    final JFrame frame = new JFrame("Generator");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel pane1 = new JPanel(); //INCORRECT

相反,请使用静态参考:

public static void createAndShowGUI() {
    final JFrame frame = new JFrame("Generator");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pane1 = new JPanel(); //CORRECT