【问题标题】:JTextArea in MigLayout causes NullPointerExceptionMigLayout 中的 JTextArea 导致 NullPointerException
【发布时间】:2012-02-12 20:27:39
【问题描述】:

我不是挥杆布局管理器的专业人士,这种行为完全让我感到困惑。基本上我不能在没有得到 NullPointerException 的情况下将 JTextArea 或 JTextPane 添加到我的 MigLayout。

我创建了一个扩展 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");
}

这很好用。但是,如果我尝试添加一个 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");
}

我在 Eclipse 中使用窗口设计器,所以我假设有什么东西正在启动 MigLayout 构造函数?我已经为此苦苦思索了一段时间,但我设法弄清楚的是添加 textArea 或 textPanes 会导致以下异常:

java.lang.NullPointerException 在 javax.swing.BoxLayout.preferredLayoutSize(未知来源)在 java.awt.Container.preferredSize(未知来源)在 java.awt.Container.getPreferredSize(未知来源)在 javax.swing.JComponent.getPreferredSize(未知来源)在 javax.swing.JRootPane$RootLayout.preferredLayoutSize(未知来源) 在 java.awt.Container.preferredSize(Unknown Source) 在 java.awt.Container.getPreferredSize(未知来源)在 javax.swing.JComponent.getPreferredSize(未知来源)在 java.awt.BorderLayout.preferredLayoutSize(未知来源)在 java.awt.Container.preferredSize(未知来源)在 java.awt.Container.getPreferredSize(未知来源)在 net.miginfocom.swing.MigLayout.adjustWindowSize(未知来源)在 net.miginfocom.swing.MigLayout.layoutContainer(未知来源)在 net.miginfocom.swing.MigLayout.preferredLayoutSize(未知来源)在 java.awt.Container.preferredSize(未知来源)在 java.awt.Container.getPreferredSize(未知来源)在 javax.swing.JComponent.getPreferredSize(未知来源)在 javax.swing.BoxLayout.checkRequests(未知来源)在 javax.swing.BoxLayout.layoutContainer(未知来源)在 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.Container.validate(未知来源)在 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.InvocationEvent.dispatch(Unknown Source) 在 java.awt.EventQueue.dispatchEventImpl(未知来源)在 java.awt.EventQueue.access$000(未知来源)在 java.awt.EventQueue$1.run(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.AccessControlContext$1.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue.dispatchEvent(未知源)在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 来源)在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(Unknown Source) 在 java.awt.EventDispatchThread.run(未知来源)线程中的异常 “AWT-EventQueue-0”java.lang.NullPointerException 在 javax.swing.SizeRequirements.calculateTiledPositions(未知来源) 在 javax.swing.BoxLayout.layoutContainer(Unknown Source) 在 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.Container.validate(未知来源)在 java.awt.Window.dispatchEventImpl(未知来源)在 java.awt.Component.dispatchEvent(未知来源)在 java.awt.EventQueue.dispatchEventImpl(未知来源)在 java.awt.EventQueue.access$000(未知来源)在 java.awt.EventQueue$1.run(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 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) 在 java.security.AccessControlContext$1.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue.dispatchEvent(未知源)在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 来源)在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(Unknown Source) 在 java.awt.EventDispatchThread.run(未知来源)

【问题讨论】:

  • 如果你把JTextArea改成其他组件,比如按钮、标签等,它是否有效?

标签: java eclipse swing miglayout windowbuilder


【解决方案1】:

使用 MigLayout 4.0,您的代码可以在我的计算机上正常运行。如果您修复了源附件,您也许可以深入了解 BoxLayout 并更好地了解正在发生的事情。

在源代码中没有实际行号的情况下,我在BoxLayout.preferredLayoutSize() 中看到的唯一可能引发的情况是,如果您的 UI 设置了一个返回空插入的 Border。这似乎不太可能,但您可以尝试在文本区域上显式设置边框作为实验。

【讨论】:

  • 我尝试更新到 MigLayout 4.0,但没有解决问题。我最终在链条上进一步跟踪问题 - 我正在动态构建显示,需要让 SwingUtilities 管理我的面板的创建。
【解决方案2】:

问题最终是我需要让 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 中包含文本区域而不会出现任何问题。

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 2016-03-07
    • 2017-05-16
    • 1970-01-01
    • 2014-06-09
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多