2017-03-31 3 views
1

Java Swing 응용 프로그램에서 탭 분할 창을 작성하려고하지만 작동하지 않습니다.JTabbedPane ArrayIndexOutOfBoundsException : 0

JTabbedPanecontentpane으로 설정하면 모든 것이 잘됩니다. 탭을 추가하려고하면 ArrayIndexOutOfBoundsException: 0이 표시됩니다.

구성 요소가 창에 추가되지만 그럼에도 불구하고이 오류가 발생했습니다. 내 코드와 오류가 아래에 있습니다.

코드 :

// This all happens in a class which extends JFrame 

private JTabbedPane contentPane; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       ConfigBuilderWindow frame = new ConfigBuilderWindow(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public ConfigBuilderWindow() { 
    setTitle("Config Builder"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 916, 617); 
    contentPane = new JTabbedPane(); 
    contentPane.setBorder(new LineBorder(Color.BLUE, 4)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 

    contentPane.addTab("Test1", new JButton("Test1")); 
    contentPane.addTab("Test2", new JButton("Test2")); 

    setContentPane(contentPane); 
} 

오류 :

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 
at javax.swing.plaf.basic.BasicTabbedPaneUI.paintTabArea(Unknown Source) 
at javax.swing.plaf.basic.BasicTabbedPaneUI.paint(Unknown Source) 
at javax.swing.plaf.metal.MetalTabbedPaneUI.paint(Unknown Source) 
at javax.swing.plaf.metal.MetalTabbedPaneUI.update(Unknown Source) 
at javax.swing.JComponent.paintComponent(Unknown Source) 
at javax.swing.JComponent.paint(Unknown Source) 
at javax.swing.JComponent.paintChildren(Unknown Source) 
at javax.swing.JComponent.paint(Unknown Source) 
at javax.swing.JLayeredPane.paint(Unknown Source) 
at javax.swing.JComponent.paintChildren(Unknown Source) 
at javax.swing.JComponent.paintToOffscreen(Unknown Source) 
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source) 
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source) 
at javax.swing.RepaintManager.paint(Unknown Source) 
at javax.swing.JComponent.paint(Unknown Source) 
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source) 
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source) 
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source) 
at java.awt.Container.paint(Unknown Source) 
at java.awt.Window.paint(Unknown Source) 
at javax.swing.RepaintManager$4.run(Unknown Source) 
at javax.swing.RepaintManager$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source) 
at javax.swing.RepaintManager.access$1200(Unknown Source) 
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source) 
at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

나는 사람이 무슨 일이 일어나고 있는지 알고 있기를 바랍니다. 당신이 BorderLayoutcontentPane로 설정하는 이유

+1

'SwingUtilities.invokeLater (Runnable r)'을 사용하여 Swing 이벤트 스레드에서 GUI를 시작 하시겠습니까? –

+4

스택 오버플로에 오신 것을 환영합니다! [둘러보기] (http://stackoverflow.com/tour)를 방문하고 둘러보고 [도움말 센터] (http://stackoverflow.com/help)를 읽으십시오. 특히 [어떻게 묻는가?] 좋은 질문입니까?] (http://stackoverflow.com/help/how-to-ask) 및 [여기에 대해 내가 들려 줄 주제는 무엇입니까?] (http://stackoverflow.com/help/on-topic). [최소, 완전하고 검증 가능한 예 (MCVE)]를 제공하십시오 (http://stackoverflow.com/help/mcve) –

+0

예. 내가해서는 안되는 일인가요? –

답변

4

잘 모르겠어요, 난 당신이 tabbedPane에 변수 이름을 변경하고이 줄을 제거하는 것이 좋습니다 :

tabbedPane.setLayout(new BorderLayout(0, 0)); 

이 오류를 해결합니다.

탭의 레이아웃을 편집하려면 해당 레이아웃을 사용하여 JPanel을 만들고 JButton 대신 매개 변수로 전달하십시오.

주목해야 할 또 다른 것은

는 제쳐두고 참고로, JFrame을 확장 The use of multiple JFrames, Good/Bad practice? 표시되지 않는 지금 setBounds하지만 pack()setLocation() 또는 setLocationRelativeTo 또는 setLocationByPlatform() 방법 대신

를 호출하지 않습니다 (일반적인 합의는 나쁜 관행 말한다). 또한 참조하십시오 Extends JFrame vs creating it inside of class

+0

그게 정말로 고쳐 줬어, 고마워! 저는 Java에서 Swing과 GUI에 익숙하지 않아서 엉망으로 만들 수 있다는 것을 몰랐습니다. –

+0

@FinnBon : 실제로 JTabbedPane이 자신의 레이아웃 관리자를 사용하므로 탭 밖으로 올바르게 레이아웃하지 못하도록합니다. 그러나 논리적으로 생각하면 왜 이것을하고 싶습니까?앞으로 귀하의 질문에 유효한 [mcve]를 게시하십시오. 이는 복사하여 붙여 넣기를하고 수정하지 않고 실행할 수 있음을 의미합니다. 유효한 클래스 또는 가져 오기를 표시하지 않았기 때문에 코드로는 할 수 없습니다. 핵심은 가능한 한 쉽게 질문에 대답 할 수있게하는 것입니다. (이 답변에 1+) –