Обнаружены ошибки при замене JPanels - PullRequest
2 голосов
/ 24 сентября 2011

Я нахожусь в процессе создания меню с несколькими панелями, которые удаляются / добавляются, когда пользователь перемещается, нажимая кнопки.

Перепробовав разные вещи, я пришел к тому, что было для меня наиболее разумным, но дает ошибки.

Мое ошибочное "решение":

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)

Я пробежал через различные способы устранения неполадок, но я не уверен, в чем проблема. Помощь очень ценится, спасибо.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

NullPointerException - одна из самых простых проблем для диагностики, потому что она сообщает вам исходный файл и номер строки, в которой это происходит.

В вашем случае это

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

Открытьвашей IDE, перейдите к этой строке и найдите ссылки на разыменованные объекты.Один из них нулевой;вы предполагали, что это не так.

Если этого недостаточно, установите точку останова и перейдите к этому месту в отладчике.Он точно скажет вам, что является нулем.

Как только вы это выясните, подумайте, почему этот объект не инициализирован должным образом, и исправьте его.

1 голос
/ 24 сентября 2011

1) вы не можете объявить, поскольку getContentPane() бесполезен из Java5 и выше

2) если там не объявлено ни одного LayoutManager (вероятно, ваш случай), то JFrame, JDialog или JWindow имеет по умолчанию BorderLayout, все другие JComponents имеют значение по умолчанию FlowLayout

3), если есть BorderLayout и нет объявленной области принятия решения (CENTER, NORTH ...), тогда Component по умолчанию помещается в область CENTER

4) для переключения между JComponents и только если используется BorderLayout, требуется вызов only

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

а у вас бывает только

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