2012-01-18 78 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

相关问题