开发者

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜