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

使用java swing删除导致NullPointerException的窗格,java,swing,nullpointerexception,jframe,jpanel,Java,Swing,Nullpointerexception,Jframe,Jpanel,我试着清理一个窗格,然后用swing将一个新窗格放回原处。但在我当前的设置中,它抛出了一个我不理解的NullPointerException。这是我的密码: public static void createAndShowGUI() { final JFrame frame = new JFrame("Generator"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel pane1 = new

我试着清理一个窗格,然后用swing将一个新窗格放回原处。但在我当前的设置中,它抛出了一个我不理解的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();
        }
    });
pane1已声明为
public static JPanel pane1=null在课程的开头。当我用actionlistener单击按钮时,它在线程“AWT-EventQueue-0”java.lang.NullPointerException中抛出
异常,指向
pane1.removeAll()

为什么会出现这个错误?我知道我遗漏了一些重要的东西,有人知道它是什么,或者知道实现我想要的东西的替代方法吗

通过以下方式感谢您:

JPanel pane1 = new JPanel();
您正在createAndShowGUI中创建第二个名为pane1的局部变量。您没有使用定义为静态的全局变量。那个还是空的。您应该这样创建它:

pane1 = new JPanel();
通过这样做:

JPanel pane1 = new JPanel();
您正在createAndShowGUI中创建第二个名为pane1的局部变量。您没有使用定义为静态的全局变量。那个还是空的。您应该这样创建它:

pane1 = new JPanel();

如果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
相反,请使用静态引用:

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

如果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
相反,请使用静态引用:

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

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

可以从上的Swing教程中的
按钮demo
这样的简单示例开始。然后将
instance
变量添加到可以从侦听器访问的类中

现在,当我单击移除窗格的按钮时,它只是停留在单击位置,什么也没有发生

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

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

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

可以从上的Swing教程中的
按钮demo
这样的简单示例开始。然后将
instance
变量添加到可以从侦听器访问的类中

现在,当我单击移除窗格的按钮时,它只是停留在单击位置,什么也没有发生

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

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

如果pane1为null,并且如果调用pane1.somemethod(),则其OBVIUO将引发NullPointerException如果pane1为null,并且如果调用pane1.somemethod(),则其OBVIUO将引发NullPointerException,这是有意义的。现在,当我单击移除窗格的按钮时,它只是停留在单击位置,什么也没有发生。我猜,因为它是在窗格上被删除,一个问题正在发生。有什么解决方案吗?@Cole,应该是
revalidate()
,不要使用静态变量和方法。这也许可以回答您的问题,但这不是设计GUI的好方法。如果一开始没有静态声明,我如何制作一个可移动窗格?请原谅,我一直在学习java,这是有道理的。现在,当我单击移除窗格的按钮时,它只是停留在单击位置,什么也没有发生。我猜,因为它是在窗格上被删除,一个问题正在发生。有什么解决方案吗?@Cole,应该是
revalidate()
,不要使用静态变量和方法。这也许可以回答您的问题,但这不是设计GUI的好方法。如果一开始没有静态声明,我如何制作一个可移动窗格?恕我直言,我正在学习java。谢谢,我将尝试修复它。
如何在开始时制作一个没有静态声明的可移动窗格?
-先看一下教程。该类扩展了一个JPanel,因此您可以创建和添加任意数量的面板。您可以将每个面板定义为一个实例变量,就像类当前对每个按钮所做的那样。谢谢,我将研究它。谢谢,我将尝试修复它。
如何在开始时创建一个没有静态声明的可移动窗格?
-先看教程。该类扩展了一个JPanel,因此您可以创建和添加任意数量的面板。您可以将每个面板定义为一个实例变量,就像类当前对每个按钮所做的那样。谢谢,我将研究它。