Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更换JPanel时遇到错误_Java_Swing_Replace_Jframe_Jpanel - Fatal编程技术网

Java 更换JPanel时遇到错误

Java 更换JPanel时遇到错误,java,swing,replace,jframe,jpanel,Java,Swing,Replace,Jframe,Jpanel,我正在创建一个包含多个面板的菜单,当用户通过单击按钮进行导航时,这些面板将被删除/添加 在尝试了各种各样的事情之后,我找到了一个对我来说最有意义但却给了我错误的方法 生成“解决方案”时出错: 出于某种原因,它会产生以下错误: $Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at java.awt.Container.addImpl(Container.java:1041) at java.awt.Con

我正在创建一个包含多个面板的菜单,当用户通过单击按钮进行导航时,这些面板将被删除/添加

在尝试了各种各样的事情之后,我找到了一个对我来说最有意义但却给了我错误的方法

生成“解决方案”时出错:

出于某种原因,它会产生以下错误:

$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)

我已经进行了各种故障排除,但我不确定问题出在哪里。非常感谢您的帮助。

NullPointerException是最容易诊断的问题之一,因为它会告诉您源文件及其发生的行号

在你的情况下,它是

phantasma.OriginalFrame.changePanels(OriginalFrame.java:156)
打开IDE,转到该行,查找未引用的对象引用。其中一个是空的;你以为不是

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

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

1)你不能声明
getContentPane()
在Java5和更高版本中是无用的

2) 是否没有声明任何
LayoutManager
(可能是您的情况)然后
JFrame
JDialog
JWindow
默认具有
BorderLayout
,所有其他JC组件都具有默认的
FlowLayout

3) 如果存在
BorderLayout
且不存在已声明的决策区域(中心、北部…),则默认情况下
组件
放置在
中心
区域

4) 要在
JComponents
之间切换,并且仅当使用了
BorderLayout
时,才需要调用
only

myContainer.add(someComponent, BorderLayout.DECISION_AREA);
revalidate();
repaint();
在你的情况下只是

add(someComponent);
revalidate();
repaint();

跟进Russ的评论:尝试创建一个空白的沙盒应用程序,并使用此方法交换两个您知道不为
null
的面板。看看它是否有效。修复NPE后,请使用
CardLayout
。谢谢大家,它确实为空,我的解决方案现在实际上是一个解决方案:D编辑:CardLayout的优点是什么?我不认为我可以使用它,因为我有一个特殊的情况-我使用了GridBagLayout,因为我需要在JLabel(我的背景)上使用按钮。非常感谢,它现在工作得非常好!我分析了singlePanel1的所有内容,并设法发现它的声明与我记忆中的不一样。嗨,我使用了GridBagLayout,但我接受了你关于
getContentPane()
的建议,还将我的
validate()
更改为
revalidate()
。谢谢
add(someComponent);
revalidate();
repaint();