我正在尝试清除一个窗格,并在其位置放置一个新窗格。但是使用我当前的设置,它会抛出一个我不明白的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();
。
为什么会出现此错误?我知道有一些重要的东西我不知道,有没有人知道它是什么或知道另一种方法来实现我想要的东西?
由于
答案 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