MigLayout中的JTextArea导致NullPointerException



我不是swing布局管理器的专业人员,这种行为完全让我感到困惑。基本上我不能添加一个JTextArea或JTextPane到我的MigLayout没有得到一个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");
}

这很好。但是,如果我尝试添加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或textpane导致以下异常:

. lang。NullPointerException,javax.swing.BoxLayout。preferredLayoutSize(未知来源)atjava.awt.Container。preferredSize(未知来源)atjava.awt.Container。getPreferredSize(未知来源)atjavax.swing.JComponent。getPreferredSize(未知来源)atjavax.swing.JRootPane RootLayout美元。preferredLayoutSize(未知来源)在java.awt.Container。preferredSize(未知来源)atjava.awt.Container。getPreferredSize(未知来源)atjavax.swing.JComponent。getPreferredSize(未知来源)atjava.awt.BorderLayout。preferredLayoutSize(未知来源)atjava.awt.Container。preferredSize(未知来源)atjava.awt.Container。getPreferredSize(未知来源)atnet.miginfocom.swing.MigLayout。调整窗口大小(未知来源)net.miginfocom.swing.MigLayout。layoutContainer(来源未知)net.miginfocom.swing.MigLayout。preferredLayoutSize(未知来源)atjava.awt.Container。preferredSize(未知来源)atjava.awt.Container。getPreferredSize(未知来源)atjavax.swing.JComponent。getPreferredSize(未知来源)atjavax.swing.BoxLayout。checkRequests(未知来源)javax.swing.BoxLayout。layoutContainer(来源未知)java.awt.Container。布局(未知来源)在java.awt.Container。布局(未知来源)java.awt.Container。validateTree(未知来源)atjava.awt.Container。validateTree(未知来源)atjava.awt.Container。validateTree(未知来源)atjava.awt.Container。validateTree(未知来源)atjava.awt.Container。验证(未知来源)java.awt.Window。show(来源不明)在java.awt.Component。show(来源不明)在java.awt.Component。setVisible(未知来源)java.awt.Window。setVisible(未知来源)com.soartech.ssim.testbed.gui.TestbedApplication运行1.美元(TestbedApplication.java: 25)在java.awt.event.InvocationEvent。派遣(来源不明)java.awt.EventQueue。(来源不明)java.awt.EventQueue。访问$000(来源不明)java.awt.EventQueue$1.run(来源未知java.awt.EventQueue$1.run(来源未知java.security.AccessController。特权(本地方法)在java.security.AccessControlContext dointersectionprivilege 1.美元(未知来源)java.awt.EventQueue。dispatchEvent(未知源)java.awt.EventDispatchThread。pumpOneEventForFilters(未知来源)在java.awt.EventDispatchThread。pumpEventsForFilter(未知来源)java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源)java.awt.EventDispatchThread。pumpEvents(未知来源)在java.awt.EventDispatchThread。pumpEvents(来源不明)java.awt.EventDispatchThread.run(来源未知)线程异常"AWT-EventQueue-0javax.swing.SizeRequirements。calculateTiledPositions(未知来源)在javax.swing.BoxLayout。layoutContainer(来源未知)java.awt.Container。布局(未知来源)在java.awt.Container。布局(未知来源)java.awt.Container。validateTree(未知来源)atjava.awt.Container。validateTree(未知来源)atjava.awt.Container。validateTree(未知来源)atjava.awt.Container。validateTree(未知来源)atjava.awt.Container。验证(未知来源)java.awt.Window。(来源不明)java.awt.Component。dispatchEvent(未知源)java.awt.EventQueue。(来源不明)java.awt.EventQueue。访问$000(来源不明)java.awt.EventQueue$1.run(来源未知java.awt.EventQueue$1.run(来源未知java.security.AccessController。特权(本地方法)在java.security.AccessControlContext dointersectionprivilege 1.美元(未知源)java.security.AccessControlContext dointersectionprivilege 1.美元(未知java.awt.EventQueue$2.run(来源未知java.awt.EventQueue$2.run(来源未知java.security.AccessController。特权(本地方法)在java.security.AccessControlContext dointersectionprivilege 1.美元(未知来源)java.awt.EventQueue。dispatchEvent(未知源)java.awt.EventDispatchThread。pumpOneEventForFilters(未知来源)在java.awt.EventDispatchThread。pumpEventsForFilter(未知来源)java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源)java.awt.EventDispatchThread。pumpEvents(未知来源)在java.awt.EventDispatchThread。pumpEvents(来源不明)java.awt.EventDispatchThread.run(未知源)

使用MigLayout 4.0,您的代码在我的计算机上运行良好。如果你修复你的源附件,你可能能够深入到BoxLayout,并得到一个更好的想法是什么正在发生。

在源代码中没有实际的行号,我在BoxLayout.preferredLayoutSize()中看到的唯一可能抛出的事情是,如果你的UI设置了一个返回null insets的Border。这似乎不太可能,但您可以尝试在文本区域显式地设置边框,就像一个实验。

最后的问题是,我需要让swinguutilities为我创建面板,因为它们是通过编程生成的。

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中包含文本区域没有任何问题。

相关内容

最新更新