无法向 JFrame 添加任何组件 - IllegalArgumentException



当我试图在构造函数中向JFrame添加任何内容时,我遇到了IllegalArgumentException。

类似的代码正在文档中工作:https://docs.oracle.com/javase/tutorial/uiswing/layout/none.html

为什么我的简单代码不起作用?它是在Netbeans 10中创建的。

编辑:我还尝试添加带有位置和大小的标签(setBounds(,但没有帮助。我用setBounds方法更改了代码。

首先,JavaTestApp.java中的主类:

package javatestapp;
public class JavaTestApp {
public static void main(String[] args) {
TestForm mainFrame = new TestForm();
mainFrame.setLocation(300, 150);
mainFrame.setVisible(true);
mainFrame.toFront();
mainFrame.repaint();
}
}

第二个文件是:

package javatestapp;
import javax.swing.JLabel;
public class TestForm extends javax.swing.JFrame {
/**
* Creates new form TestForm
*/
public TestForm() {
initComponents();
JLabel label = new JLabel("Test label");
label.setBounds(10,10,100,25);        
getContentPane().add(label);
}
// GENERATED CODE BELOW
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
pack();
}// </editor-fold>                        
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(TestForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(TestForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(TestForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(TestForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TestForm().setVisible(true);
}
});
}

Stacktrace,关于@VGR请求:

Exception in thread "main" java.lang.IllegalArgumentException
at org.netbeans.lib.awtextra.AbsoluteLayout.addLayoutComponent(Unknown Source) 
at java.awt.Container.addImpl(Container.java:1120)
at java.awt.Container.add(Container.java:410)
at javatestapp.TestForm.<init>(TestForm.java:16)
at javatestapp.JavaTestApp.main(JavaTestApp.java:5) 
BUILD STOPPED (total time: 9 seconds)

转发上传的项目链接:项目(通过我的Bitdefender antivir扫描(

我也选择了绝对布局

这就是你的问题。您没有正确使用它。

getContentPane().add(label);

在不指定适当约束的情况下,不能仅将标签添加到框架中。我从未使用过AbsoluteLayout(因为我相信正确的布局管理(,但我想你需要指定x、y、宽度、高度等约束。

布局管理器无法猜测组件的位置,因此需要指定所有信息。这就是为什么您应该使用布局管理器。然后布局管理器将根据布局管理器的规则定位组件。只要你稍微练习一下就容易多了。

最新更新