Java Can';t将任何组件添加到JFrame-IllegalArgumentException
当我试图在构造函数中向JFrame添加任何内容时,我遇到了IllegalArgumentException 类似的代码在文档中工作: 为什么我的简单代码不起作用?它是在Netbeans 10中创建的 编辑: 我还尝试添加带有位置和边缘的标签,但没有帮助。我用setBounds方法修改了代码 首先,JavaTestApp.java中的主类:Java Can';t将任何组件添加到JFrame-IllegalArgumentException,java,swing,jframe,Java,Swing,Jframe,当我试图在构造函数中向JFrame添加任何内容时,我遇到了IllegalArgumentException 类似的代码在文档中工作: 为什么我的简单代码不起作用?它是在Netbeans 10中创建的 编辑: 我还尝试添加带有位置和边缘的标签,但没有帮助。我用setBounds方法修改了代码 首先,JavaTestApp.java中的主类: package javatestapp; public class JavaTestApp { public static void main(S
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);
}
});
}
包javatestapp;
导入javax.swing.JLabel;
公共类TestForm扩展了javax.swing.JFrame{
/**
*创建新表单TestForm
*/
公共测试表单(){
初始化组件();
JLabel标签=新的JLabel(“测试标签”);
标签.立根(10,10100,25);
getContentPane().add(标签);
}
//下面生成的代码
@抑制警告(“未选中”)
//
私有组件(){
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
包装();
}//
公共静态void main(字符串参数[]){
试一试{
for(javax.swing.UIManager.LookAndFeelInfo:javax.swing.UIManager.getInstalledLookAndFeels()){
if(“Nimbus”.equals(info.getName())){
setLookAndFeel(info.getClassName());
打破
}
}
}捕获(ClassNotFoundException ex){
getLogger(TestForm.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);
}catch(实例化异常){
getLogger(TestForm.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);
}捕获(非法访问例外){
getLogger(TestForm.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);
}catch(javax.swing.UnsupportedLookAndFeelException ex){
getLogger(TestForm.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);
}
//
/*创建并显示表单*/
invokeLater(new Runnable()){
公开募捐{
新建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)
线程“main”java.lang.IllegalArgumentException中的异常
位于org.netbeans.lib.awtextra.AbsoluteLayout.addLayoutComponent(未知源)
位于java.awt.Container.addImpl(Container.java:1120)
在java.awt.Container.add处(Container.java:410)
在javatestapp.TestForm.(TestForm.java:16)
位于javatestapp.javatestapp.main(javatestapp.java:5)
构建已停止(总时间:9秒)
链接到weetransfer上上载的项目:
我还选择了绝对布局
这就是你的问题。你没有正确地使用它
getContentPane().add(label);
如果不指定适当的约束,就不能将标签添加到框架中。我从未使用过AbsoluteLayout(因为我相信适当的布局管理),但我想您需要指定x、y、宽度和高度等约束
布局管理器无法猜出您要将组件放置在何处,因此您需要指定所有信息。这就是为什么您应该使用布局管理器。然后布局管理器将根据布局管理器的规则放置组件。只要您稍微练习一下,就会容易得多。我觉得我需要任何关于布局管理器的好建议h为我提供了学习Java SE和Swing的正确方法。我已经阅读了许多教程和主题。添加新组件是上面链接的文档中常见的事情。它必须简单。因此我必须不理解某些东西。如果您能向我推荐可能比Oracle文档更好的课程,以及本论坛和许多视频中的主题,我将非常高兴Youtube上的eos?大多数具有类似IllegalArgumentException的人在尝试时都会遇到问题:-将JFrame添加到JFrame或JPanel,-将未初始化的变量添加到JFrame窗格,-使用的布局如Flow需要更多参数(aligment或类似的东西,即FLowLayout.CENTER),-我相信会有更多的案例。我在谷歌上读了很多主题,花了我好几天的时间。没有任何帮助。好吧,第一个建议是停止使用GUI生成器,“手工”编写代码,
Absolute Layout
与null Layout
相同,并且会导致将来在另一台具有不同OS/PLAF/屏幕大小或分辨率的计算机上进行测试时出现类似问题。第二个建议是发布堆栈跟踪。第三个建议是不要扩展JFrame
,您不会更改其行为,所以只需创建一个i事实证明。布局管理是一个复杂的主题,但经过一些时间和实践,你可以做一些出色的事情。例如,编辑你的问题,并包括你遇到的异常的完整堆栈跟踪。它将告诉我们和你,哪里出了问题,哪里出了问题。这个回答只得到了部分回答。事实是——不要使用绝对布局不正确-给出坐标和尺寸并没有帮助。一般结论是总的绝对布局弱点,迫使布局改变为其他布局。