简体   繁体   English

MigLayout中的JTextArea导致NullPointerException

[英]JTextArea in MigLayout causes NullPointerException

I'm not a pro with swing layout managers and this behavior is completely baffling me. 我不是挥杆布局经理的专业人士,这种行为使我完全困惑。 Essentially I can't add a JTextArea or JTextPane to my MigLayout without getting a NullPointerException. 本质上,如果没有得到NullPointerException,就无法将JTextArea或JTextPane添加到我的MigLayout中。

I created a class that extends JPanel: 我创建了一个扩展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");
}

This works fine. 这很好。 However, if I try adding a textArea, it will throw an exception when I try to build: 但是,如果尝试添加textArea,则在尝试构建时会引发异常:

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

I'm using the Window Designer in eclipse, so I'm assuming something is horking up the MigLayout constructor? 我在eclipse中使用Window Designer,所以我假设有些事情使MigLayout构造函数烦人了? I've been beating my head on this for awhile and all I've managed to figure out is that adding textArea or textPanes causes the following exception: 我已经对此打了一段时间,我设法弄清楚的是,添加textArea或textPanes会导致以下异常:

java.lang.NullPointerException at javax.swing.BoxLayout.preferredLayoutSize(Unknown Source) at java.awt.Container.preferredSize(Unknown Source) at java.awt.Container.getPreferredSize(Unknown Source) at javax.swing.JComponent.getPreferredSize(Unknown Source) at javax.swing.JRootPane$RootLayout.preferredLayoutSize(Unknown Source) at java.awt.Container.preferredSize(Unknown Source) at java.awt.Container.getPreferredSize(Unknown Source) at 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) at net.miginfocom.swing.MigLayout.adjustWindowSize(Unknown Source) at net.miginfocom.swing.MigLayout.layoutContainer(Unknown Source) at net.miginfocom.swing.MigLayout.preferredLayoutSize(Unknown Source) at java.awt.Container.preferredSize(Unknown Source) at java.awt.Container.getPreferredSize(Unknown Source) at javax.swing.JComponent. Javax.swing.BoxLayout.preferredLayoutSize(未知源)处的java.lang.NullPointerException javax.swing.JComponent.getPreferredSize(java.awt.Container.getPreferredSize(未知源)处的java.awt.Container.preferredSize(未知源)处的java.lang.NullPointerException javax.swing.JRootPane $ RootLayout.preferredLayoutSize(Unknown Source)处java.awt.Container.getPreferredSize(Unknown Source)处javax.swing.JComponent.getPreferredSize(Unknown Source) net.miginfocom.swing.MigLayout.adjustWindowSize(java.awt.Container.getPreferredSize(Unknown Source)处的java.awt.BorderLayout.preferredLayoutSize(Unknown Source) net.miginfocom.swing.MigLayout.layoutContainer上的Unknown Source)(net.miginfocom.swing.MigLayout.preferredLayoutSize(Unknown Source)上的java.awt.Container.preferredSize(Unknown Source)上的java.awt.Container的Unknown Source)。 javax.swing.JComponent上的getPreferredSize(Unknown Source)。 getPreferredSize(Unknown Source) at javax.swing.BoxLayout.checkRequests(Unknown Source) at javax.swing.BoxLayout.layoutContainer(Unknown Source) at java.awt.Container.layout(Unknown Source) at java.awt.Container.doLayout(Unknown Source) at 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) at 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) at 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 javax.swing.BoxLayout.checkRequests中的getPreferredSize(Unknown Source)(java.awt.Container.layout中的javax.swing.BoxLayout.layoutContainer(未知源)(java.awt.Container.doLayout中的Unknown Source)(未知源) java.awt.Container.validateTree中的“未知源”(java.awt.Container.validateTree中的java.awt.Container.validateTree(未知源)中的java.awt.Container.validateTree(未知源)中的Unknown Source) )处java.awt.Container.validate(未知源)处java.awt.Component.show(未知源)处java.awt.Component.setVisible(未知源)处Java处java.awt.event.InvocationEvent.dispatch(Unknown Source)处com.soartech.ssim.testbed.gui.TestbedApplication $ 1.run(TestbedApplication.java:25)处的java.awt.Window.setVisible(未知源)。 awt.EventQueue.dispatchEventImpl(未知源)在java.awt.EventQueue.access $ 000(未知源)在java.awt.EventQueue $ 1.run(未知源)在java.awt.EventQueue $ 1.run(未知 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(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) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at javax.swing.SizeRequirements.calculateTiledPositions(Unknown Source) at javax.swing.BoxLayout.layoutContainer(Unknown Source) at java.awt.Container.layout(Unknown Source) at java.awt.Container.doLayout(Unknown Source) at java.awt.Container.validateTree(Unknown Source) at java.awt.Container.validateTree(Unknown Source) at java.awt.Container.va Source)java.security.AccessController.doPrivileged(本机方法)java.security.AccessControlContext $ 1.doIntersectionPrivilege(未知源)java.awt.EventQueue.dispatchEvent(未知源)java.awt.EventDispatchThread.pumpOneEventForFilters(未知源) )处java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源)处java.awt.EventDispatchThread.pumpEvents(未知源)处java.awt.EventDispatchThread.pumpEvents(未知源)处java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源) java.awt.EventDispatchThread.run(未知源)线程“ AWT-EventQueue-0”中的异常javax.swing.SizeRequirements.calculateTiledPositions(javax.swing.BoxLayout.layoutContainer处的java.lang.NullPointerException(未知源)在java.awt.Container.layout(Unknown Source)在java.awt.Container.doLayout(Unknown Source)在java.awt.Container.validateTree(Unknown Source)在java.awt.Container.validateTree(Unknown Source)在java .awt.Container.va lidateTree(Unknown Source) at java.awt.Container.validateTree(Unknown Source) at 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 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 Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$2.run(Unknown Source) at 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(Unknown Sou 在java.awt.Container.validateTree的lidateTree(未知源)在java.awt.Window.dispatchEventImpl的java.awt.Container.validate(未知源)在java.awt.Component.dispatchEvent(未知源) java.awt.EventQueue.dispatchEventImpl(未知源)java.awt.EventQueue.access $ 000(java.awt.EventQueue $ 1.run中的未知源)(java.awt.EventQueue $ 1.run中的Unknown Source) (未知源)在java.security.AccessController.doPrivileged(本地方法)在java.security.AccessControlContext $ 1.doIntersectionPrivilege(未知源)在java.security.AccessControlContext $ 1.doIntersectionPrivilege(未知源)在java.awt.EventQueue $ 2。在java.awt.EventQueue处运行(未知源)$ 2。在java.security.AccessController.doPrivileged(本机方法)处运行(未知源)在java.awt.EventQueue处的java.security.AccessControlContext $ 1.doIntersectionPrivilege(未知源)处。 java.awt.EventDispatchThread.pumpOneEventForFilters中的dispatchEvent(未知源)(未知Sou) rce) 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) rce),位于java.awt.EventDispatchThread.pumpEvents(未知源),位于java.awt.EventDispatchThread.pumpEvents(未知源),位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源),位于java.awt.EventDispatchThread.pumpEvents(未知源)在java.awt.EventDispatchThread.run(未知源)

With MigLayout 4.0 your code runs fine on my computer. 使用MigLayout 4.0,您的代码可以在我的计算机上正常运行。 If you fix your source attachment you might be able to dig down into BoxLayout and get a better idea about what is going on. 如果您修复了源附件,则可以深入研究BoxLayout并更好地了解正在发生的事情。

Without having the actual line number in the source, the only thing I see in BoxLayout.preferredLayoutSize() that might throw is if your UI is setting a Border that returns a null insets. 没有源中的实际行号,我在BoxLayout.preferredLayoutSize()中看到的唯一可能是您的UI设置的是返回空inset的Border This seems unlikely, but you could try setting a border on the text area explicitly just as an experiment. 这似乎不太可能,但是您可以尝试像实验一样在文本区域上明确设置边框。

The problem ended up being that I needed to let SwingUtilities create my panels for me, because they were being programmatically generated. 问题最终是我需要让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);

Now that this is in place, I can include text areas in my MigLayout without any problems. 现在就位,我可以在我的MigLayout中包括文本区域,而不会出现任何问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM