Encountering errors when replacing JPanels
I'm in the process of creating a menu with several panels that are removed/added as the user navigates by clicking on buttons.
After trying various things, I came to one that made the most sense to me but gives me errors.
My error-producing "solution":
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();
}
For some reason, it produces these errors:
$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.dispatchEvent开发者_开发问答Impl(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)
I've run through various troubleshooting, but I'm not sure what the issue is. Help is greatly appreciated, thank you.
NullPointerException is one of the easiest problems to diagnose, because it tells you the source file and the line number at which it occurs.
In your case, it's
phantasma.OriginalFrame.changePanels(OriginalFrame.java:156)
Open your IDE, go to that line, and look for dereferenced object references. One of them is null; you assumed it wasn't.
If that's not enough, set a breakpoint and navigate to that spot in the debugger. It'll tell you exactly what's null.
Once you figure that out, think about why that object isn't initialized properly and fix it.
1) you can't declare for getContentPane()
is useless from Java5 and higher
2) is isn't there declared any LayoutManager
(probably your case) then JFrame
, JDialog
or JWindow
has by default BorderLayout
, all another JComponents have got ba default FlowLayout
3) if is there BorderLayout
and isn't there declared decision Area (CENTER, NORTH...), then Component
is by default placed to the CENTER
area
4) for switch between JComponents
and only if is there used BorderLayout
, is required call only
myContainer.add(someComponent, BorderLayout.DECISION_AREA);
revalidate();
repaint();
and in you case is only
add(someComponent);
revalidate();
repaint();
精彩评论