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();