2011-09-24 6 views
2

사용자가 버튼을 클릭하여 탐색 할 때 제거되거나 추가되는 여러 패널이 포함 된 메뉴를 만드는 중입니다.JPanels를 바꿀 때 오류가 발생합니다.

다양한 것들을 시도한 후에, 나는 가장 감각적이지만 오류를주는 사람에게갔습니다.

내 오류를 생산하는 "솔루션"어떤 이유

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) 

을,하지만 난 모르겠어요 무엇을 문제는 도움이 대단히 감사합니다, 감사합니다.

+1

가 null이 될 singlePanel1 수있다? –

+1

Russ의 코멘트에 대해서 : 빈 샌드 박스 응용 프로그램을 만들고이 메소드를 사용하여 * null *이 아닌 두 개의 패널을 바꿔보십시오. 그것이 효과가 있는지보기. – wchargin

+0

일단 NPE를 수정하면'CardLayout'을 사용하십시오. –

답변

2

NullPointerException은 원본 파일과 발생하는 줄 번호를 알려주기 때문에 진단하는 것이 가장 쉬운 문제 중 하나입니다. 귀하의 경우에는

, 그것은

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

, 당신의 IDE를 열고 그 라인으로 이동하고, 역 참조 된 객체 참조를 찾아이다. 그 중 하나는 null입니다. 당신은 그것이 아니라고 생각했습니다.

충분하지 않은 경우 중단 점을 설정하고 디버거에서 해당 지점으로 이동하십시오. null이 무엇인지 정확하게 알려줄 것입니다.

일단 그 사실을 알게되면 해당 개체가 제대로 초기화되지 않은 이유를 생각하고 수정하십시오.

+0

고마워, 지금 완벽하게 작동! 필자는 singlePanel1에 관한 모든 것을 분석하고 그것이 기억 된 것처럼 선언되지 않았다는 것을 알아 냈습니다. – user16666322

1

1) getContentPane()에 대한 선언 할 수는 Java5에서 쓸모 및

2)는 높은는 모두이없는 기본 BorderLayout에 의해 다음) JFrame, JDialog 또는 JWindow했습니다 어떤 LayoutManager (아마 당신의 케이스를 선언 또 다른 JComponent의이 BorderLayout 경우) 바의 기본을 FlowLayout

3을 가지고 의사 결정 영역 (CENTER, NORTH이 ...), 다음 ComponentCENTER 영역에 배치 디폴트로이 선언되지

JComponents 사이의 스위치 4) BorderLayout이 사용되는 경우에만, 전화 only

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

하고 경우에 필요는

add(someComponent); 
revalidate(); 
repaint(); 
+0

안녕하세요, 저는 GridBagLayout을 사용했지만'getContentPane()'에 대한 제안을 받았고 내 validate()를 revalidate()로 변경했습니다. 감사! – user16666322

관련 문제