2011-09-24 70 views
2

我正在创建一个菜单,其中有几个面板在用户通过单击按钮导航时被删除/添加。更换JPanel时遇到错误

在尝试过各种各样的事情之后,我找到了一个对我最有意义但却给我错误的东西。

我的错误产生的“解决方案”:

public void actionPerformed (ActionEvent evt) { 
    Object source = evt.getSource(); 
    if (source == jButton1) { 
     changePanels(jPanel1, singlePanel1); 
    } 

} 

public void changePanels (JPanel a, JPanel b) { 
    getContentPane().removeAll(); 
    getContentPane().add(b); 
    validate(); 
    repaint(); 
} 

出于某种原因,它会产生这些错误:

$Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at java.awt.Container.addImpl(Container.java:1041) 
at java.awt.Container.add(Container.java:365) 
at phantasma.OriginalFrame.changePanels(OriginalFrame.java:156) 
at phantasma.OriginalFrame.actionPerformed(OriginalFrame.java:149) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
at java.awt.Component.processMouseEvent(Component.java:6288) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
at java.awt.Component.processEvent(Component.java:6053) 
at java.awt.Container.processEvent(Container.java:2041) 
at java.awt.Component.dispatchEventImpl(Component.java:4651) 
at java.awt.Container.dispatchEventImpl(Container.java:2099) 
at java.awt.Component.dispatchEvent(Component.java:4481) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) 
at java.awt.Container.dispatchEventImpl(Container.java:2085) 
at java.awt.Window.dispatchEventImpl(Window.java:2478) 
at java.awt.Component.dispatchEvent(Component.java:4481) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643) 
at java.awt.EventQueue.access$000(EventQueue.java:84) 
at java.awt.EventQueue$1.run(EventQueue.java:602) 
at java.awt.EventQueue$1.run(EventQueue.java:600) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
at java.awt.EventQueue$2.run(EventQueue.java:616) 
at java.awt.EventQueue$2.run(EventQueue.java:614) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

我已经通过各种故障运行,但我不知道是什么问题是。非常感谢帮助,谢谢。

+1

可能singlePanel1为空? –

+1

继续Russ的评论:尝试创建一个空白的沙盒应用程序,并使用此方法交换两个面板,您知道*不是null。看看它是否有效。 – wchargin

+0

修复NPE后,使用'CardLayout'。 –

回答

2

NullPointerException是诊断最简单的问题之一,因为它会告诉您源文件和它发生的行号。

在你的情况,这是

phantasma.OriginalFrame.changePanels(OriginalFrame.java:156) 

打开你的IDE,转到该行,并查找解除引用的对象引用。其中一个是空的;你认为它不是。

如果这还不够,请设置一个断点并在调试器中导航到该点。它会告诉你到底什么是空的。

一旦你弄明白了,想想为什么该对象没有正确初始化并修复它。

+0

非常感谢,它现在完美无缺!我分析了关于singlePanel1的一切,并设法弄清楚它没有像我记得的那样宣布。 – user16666322

1

1)你不能声明为getContentPane()是无用的,从Java5的和更高的

2)不存在默认BorderLayout宣布任何LayoutManager(可能你的情况),那么JFrameJDialogJWindow已全部另一个JComponents已经得到巴默认FlowLayout

3)如果有BorderLayout,不存在宣布决定区(中心,北...),然后Component是默认放置在CENTER区域

4)JComponents之间切换且仅当有使用BorderLayout,需要调用only

myContainer.add(someComponent, BorderLayout.DECISION_AREA); 
revalidate(); 
repaint(); 

,并在你的情况是只有

add(someComponent); 
revalidate(); 
repaint(); 
+0

嗨,我使用了GridBagLayout,但我接受了关于'getContentPane()'的建议,并将我的'validate()'改为'revalidate()'。谢谢! – user16666322