2012-01-18 6 views
2

의 원인이 동작은 날 완전히 이해할 수없는된다. 기본적으로 NullPointerException을 얻지 않고 MigLayout에 JTextArea 또는 JTextPane을 추가 할 수 없습니다.JTextArea에 내가 스윙 레이아웃 매니저와 프로 아니에요 NullPointerException이

public ComponentPanel(TestComponent testComponent) { 
    setLayout(new MigLayout("", "[]", "[][][][][][]")); 

    JLabel lblNewLabel = new JLabel("New label"); 
    add(lblNewLabel, "cell 0 0"); 

    JButton button = new JButton("New button"); 
    add(button, "cell 0 3"); 

    JButton btnNewButton = new JButton("New button"); 
    add(btnNewButton, "cell 0 5"); 
} 

이 잘 작동 :

나는 JPanel의를 확장하는 클래스를 만들었습니다. MigLayout 생성자를 horking되어 내가 이클립스 창 디자이너를 사용하고

public ComponentPanel(TestComponent testComponent) { 
    setLayout(new MigLayout("", "[grow]", "[][grow][][][][]")); 

    JLabel lblNewLabel = new JLabel("New label"); 
    add(lblNewLabel, "cell 0 0"); 

    JTextArea textArea = new JTextArea(); 
    add(textArea, "cell 0 1,grow"); 

    JButton button = new JButton("New button"); 
    add(button, "cell 0 3"); 

    JButton btnNewButton = new JButton("New button"); 
    add(btnNewButton, "cell 0 5"); 
} 

, 그래서 내가 뭔가를 있으리라 믿고있어 : 나는 텍스트 영역을 추가하려고한다면, 그것은 내가 빌드 할 때 예외가 발생합니다? 나는 잠시이 내 머리를 때리고 봤는데 내가 알아 내기 위해 관리했습니다 모두 textArea의 또는 textPanes을 추가하는 것은 다음과 같은 예외가 발생한다는 것입니다 : javax.swing.BoxLayout에서

java.lang.NullPointerException이 있습니다. 있는 javax.swing에서 javax.swing.JComponent.getPreferredSize (알 소스)에 java.awt.Container.getPreferredSize (알 소스)에 java.awt.Container.preferredSize (알 소스)에 preferredLayoutSize (알 소스). JRootPane의 $ RootLayout.preferredLayoutSize (알 수없는 소스) 01,235에서 java.awt.Container.getPreferredSize에서 java.awt.Container.preferredSize (알 수없는 소스) (알 수없는 소스)에서 java.awt.Container.getPreferredSize에서 java.awt.Container.preferredSize (알 소스)에 java.awt.BorderLayout.preferredLayoutSize (알 소스)에 16,javax.swing.JComponent.getPreferredSize (알 소스) (알 소스) 자바에서 net.miginfocom.swing.MigLayout.preferredLayoutSize (알 소스)에 net.miginfocom.swing.MigLayout.layoutContainer (알 소스)에 net.miginfocom.swing.MigLayout.adjustWindowSize (알 소스)에서. 0에서 javax.swing.BoxLayout.checkRequests에서 javax.swing.JComponent.getPreferredSize (알 소스)에 java.awt.Container.getPreferredSize (알 소스) (알 소스)에 awt.Container.preferredSize (알 소스) 에있는 javax.swing.BoxLayout.layoutContainer (알 수없는 소스) 의 java.awt.Container.layout (알 수없는 소스) 의 java.awt.Container.doLayout (알 수없는 소스) java.awt.Container.validateTree (알 수없는 소스) java.awt.Container.validate에서 java.awt.Container.validateTree (알 소스)에 java.awt.Container.validateTree (알 소스)에 java.awt.Container.validateTree (알 소스) (AT 알 수없는 소스) 에서 에서 java.awt.Window.show (알 수없는 소스) 에서 java.awt.Component.show (알 수없는 소스) 에서 java.awt.Component.setVisible (알 수없는 소스) java.awt.Window. setVisible (알 수없는 소스) ( com) soartech.ssim.testbed.gui.TestbedApplication $ 1.run (TestbedApplication.java:25) 에 java.awt.Event.Dispatch (알 수없는 소스)에서 java.awt.EventQueue.dispatchEventImpl (알 수없는 소스)에서 java .awt.EventQueue.access 에서 $ 000 (알 수없는 소스) 에서 java.awt.EventQueue $ 1.run (알 수없는 소스) java.awt.EventQueue $ 1.run (알 수없는 소스) 에서 java.security.AccessController.doPrivileged (알 수없는 소스) 메서드)를 에서 java.security.AccessControlContext $ 1.doIntersectionPrivilege (알 수없는 소스) java.awt.EventQueue.dispatchEvent (알 수없는 소스)에서 java.awt.EventDispatchThread.pumpOneEventForFilters (알 소스)에있는 java.awt java.awt.EventDispatchThread.pumpEvents에서 java.awt.EventDispatchThread.pumpEventsForHierarchy에서 java.awt.EventDispatchThread.pumpEventsForFilter (알 소스)에 (알 소스) (알 소스) . javax.swing.SizeRequirements.calculateTiledPositions에서 java.awt.EventDispatchThread.run (알 수없는 소스) 스레드 의 예외에 EventDispatchThread.pumpEvents (알 수없는 소스) "AWT-EventQueue로는-0"java.lang.NullPointerException이 (알 수없는 소스) (알 수없는 소스) 에서 java.awt.Container.layout (알 수없는 소스) 에서 java.awt.Container.doLayout (알 수없는 소스) 에서 알기. java.awt.Container.validateTree (알 소스)에 java.awt.Container.validateTree (알 소스)에 java.awt.Container.validateTree (알 소스)에 java.awt.Container.validateTree (알 소스) java.awt.EventQueue.dispatchEventImpl에서 java.awt.Component.dispatchEvent (알 소스)에 java.awt.Window.dispatchEventImpl (알 소스)에 java.awt.Container.validate (알 소스) (알에서 소스) java.security에서 java.awt.EventQueue $의 1.run (알 수없는 소스)에서 java.awt.EventQueue $의 1.run (알 수없는 소스)에서 java.awt.EventQueue.access $ 000 (알 수없는 소스)에서. AccessController.doPrivileged (네이티브 메소드) java.security.AccessControlContext $ 1.doIntersectionPrivilege에서 java.awt.EventQueue $ 2.run에서 java.security.AccessControlContext $ 1.doIntersectionPrivilege (알 소스) (알 수없는 소스)에서 (알 소스) java.awt.EventQueue $ 2 .RUN 자바에서 java.awt.EventQueue.dispatchEvent에서 java.security.AccessControlContext $ 1.doIntersectionPrivilege (알 소스) (알 수없는 소스)에서 java.security.AccessController.doPrivileged (기본 방법)에서 (알 수없는 소스). awt.EventDispatchThread.pumpOneEventForFilters (알 수없는 소스) at java.awt.EventDispatchThread.pumpEventsForFilter (알 수없는 소스) at java.awt.EventDispatchThread.pumpEventsForHierarchy (알 수 없음) MigLayout 4.0 java.awt.EventDispatchThread.run (알 소스)

+0

JTextArea를 단추, 레이블 등의 다른 구성 요소로 변경하면 작동합니까? – Alanmars

답변

0

문제는 프로그래밍 방식으로 생성 되었기 때문에 SwingUtilities가 내 패널을 만들도록해야한다는 것이 었습니다.

Runnable doWorkRunnable = new Runnable() { 
     public void run() { 
      for(TestComponent c : Config.getComponents()){ 
       frame.getContentPane().add(new ComponentPanel(c)); 
       frame.getContentPane().add(Box.createRigidArea(new Dimension(5,0))); 
      } 
     } 
    }; 
SwingUtilities.invokeLater(doWorkRunnable); 

이제 완료되었으므로 문제없이 MigLayout에 텍스트 영역을 포함 할 수 있습니다.

1

에서 java.awt.EventDispatchThread.pumpEvents (알 소스)에 java.awt.EventDispatchThread.pumpEvents (알 소스)에서 0 소스) 내 컴퓨터에서 코드가 제대로 실행됩니다. 원본 첨부 파일을 수정하면 BoxLayout으로 파 내려 가서 무슨 일이 일어나고 있는지 더 잘 이해할 수 있습니다.

소스에 실제 행 번호가 없는데, BoxLayout.preferredLayoutSize()에 표시되는 유일한 것은 UI에 null 인세 트를 반환하는 Border을 설정하는 경우입니다. 이럴 가능성은 없지만 텍스트 영역의 테두리를 실험과 마찬가지로 명시 적으로 설정할 수는 있습니다.

+0

MigLayout 4.0으로 업데이트를 시도했지만 문제가 해결되지 않았습니다.나는 체인을 따라 문제를 더 자세히 추적했다. 나는 디스플레이를 동적으로 구축하고 SwingUtilities가 내 패널을 관리하게해야했다. –