2012-01-18 81 views
2

我不是一個擁有擺動佈局管理器的職業,這種行爲完全讓我莫名其妙。基本上我不能添加一個JTextArea或JTextPane到我的MigLayout而沒有得到NullPointerException。MigLayout中的JTextArea導致NullPointerException異常

我創建的擴展JPanel類:

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"); 
} 

這工作得很好。但是,如果我嘗試添加一個文本區域,它會拋出一個異常時,我嘗試建立:

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"); 
} 

我使用的是櫥窗設計師在Eclipse中,所以我假設的東西是horking了MigLayout構造?我一直在打我的頭這一段時間,所有我已經設法搞清楚的是,添加文本區域或textPanes導致以下異常:

顯示java.lang.NullPointerException在 javax.swing.BoxLayout中。 preferredLayoutSize(Unknown Source) java.awt.Container.preferredSize(Unknown Source) javax.swing.JComponent.getPreferredSize(Unknown Source)at javax.swing。 JRootPane $ RootLayout.preferredLayoutSize(未知源) 位於java.awt.Container.preferredSize(未知源)位於 java.awt.Container.getPreferredSize(未知源)在 javax.swing.JComponent.getPreferredSize(Unknown Source)at java.awt.BorderLayout.preferredLayoutSize(Unknown Source)at java.awt.Container.preferredSize(Unknown Source)at java.awt.Container.getPreferredSize(Unknown Source )在 net.miginfocom.swing.MigLayout.adjustWindowSize(未知來源)處 net.miginfocom.swing.MigLayout.preferredLayoutSize(未知來源) net.miginfocom.swing.MigLayout.layoutContainer(未知來源)在 的java。 awt.Container.preferredSize(Unknown Source)at java.awt.Container.getPreferredSize(Unknown Source)at javax.swing.JComponent.getPreferredSize(Unknown Source)at javax.swing.BoxLayout.checkRequests(Unknown Source)at javax.swing.BoxLayout.layoutContainer(未知來源)在處 java.awt.Container.validateTree java.awt.Container.doLayout(未知來源) java.awt.Container.layout(未知源)(未知源)在 java.awt.Container.validateTree(未知來源)處 java.awt.Container.validateTree(未知來源) java.awt.Container.validateTree(未知來源)在 java.awt.Container.validate( (Unknown Source)at java.awt.Window.show(Unknown Source)at java.awt.Component.show(Unknown Source)at java.awt.Component.setVisible(Unknown Source)at java.awt.Window。 setVisible(Unknown Source)在 com。 soartech.ssim.testbed.gui.TestbedApplication $ 1.run(TestbedApplication.java:25) at java.awt.event.InvocationEvent.dispatch(Unknown Source)at java.awt.EventQueue.dispatchEventImpl(Unknown Source)at java .awt.EventQueue.access $ 000(Unknown Source)at java.awt.EventQueue $ 1.run(Unknown Source)at java.awt.EventQueue $ 1.run(Unknown Source)at java.security.AccessController.doPrivileged(Native方法)位於 java.acurity.AccessControlContext $ 1.doIntersectionPrivilege(Unknown Source)at java.awt.EventQueue.dispatchEvent(Unknown Source)at java.awt.EventDispatchThread。pumpOneEventForFilters(未知來源)在java.awt.EventDispatchThread.pumpEvents 在java.awt.EventDispatchThread.pumpEventsForFilter(未知來源) 在java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 源)(未知源) 在java.awt中。 EventDispatchThread.pumpEvents(未知來源)在 java.awt.EventDispatchThread.run(未知來源)異常螺紋 「AWT-EventQueue的-0」 顯示java.lang.NullPointerException在 javax.swing.SizeRequirements.calculateTiledPositions(未知來源) 位於javax.swing.BoxLayout.layoutContainer(未知源),位於 java.awt.Container.layout(未知源),位於 java.awt.Container.doLayout(未知源),位於 java.awt.Container.validateTree(Unknown Source)at java.awt.Container.validateTree(Unknown Source)at java.awt.Container.validateTree(Unknown Source)at java.awt.Container.validateTree(Unknown Source) java.awt.Container.validate(Unknown Source)at java.awt.Window.dispatchEventImpl(Unknown Source)at java.awt.Component.dispatchEvent(Unknown Source)at java.awt.EventQueue.dispatchEventImpl(Unknown源)在 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.security.AccessControlContext $ 1.doIntersectionPrivilege(未知 源)在java.awt.EventQueue中$ 2.run(未知來源)在 java.awt.EventQueue中$ 2 .run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at java.security.AccessControlContext $ 1.doIntersectionPrivilege(Unknown Source)at java.awt.EventQueue.dispatchEvent(Unknown Source)at java。 awt.EventDispatchThread.pumpOneEventForFilters at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 0源)處 java.awt.EventDispatchThread.run(未知來源)

+0

如果您將JTextArea更改爲其他組件,如按鈕,標籤等,它是否工作? – Alanmars 2012-01-18 03:38:52

回答

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(未知來源)同MigLayout 4.0您的代碼在我的電腦上運行良好。如果您修復了源代碼附件,您可能可以深入瞭解BoxLayout並更好地瞭解正在發生的事情。

沒有源代碼中的實際行號,我在BoxLayout.preferredLayoutSize()中看到的唯一可能會導致的情況是,如果您的UI設置了返回null insets的Border。這似乎不大可能,但您可以嘗試在文本區域上明確設置邊框,就像實驗一樣。

+0

我試圖更新到MigLayout 4.0,但它沒有解決問題。我最終跟蹤了問題的進一步發展 - 我正在動態構建顯示器,並且需要讓SwingUtilities管理我的面板的創建。 – 2012-01-18 15:52:12

相關問題