无法将任何组件添加到JFrame-IllegalArgumentException

时间:2019-11-13 22:47:54

标签: java swing jframe

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

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

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

编辑: 我也尝试添加带有位置和sieze(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)

链接到通过weetransfer上传的项目: Project (scanned via my Bitdefender antivir)

1 个答案:

答案 0 :(得分:1)

  

我还选择了绝对布局

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

    getContentPane().add(label);

您不能不指定适当的约束就将标签添加到框架中。我从未使用过AbsoluteLayout(因为我相信适当的布局管理),但是我想您需要指定x,y,宽度,高度等约束。

布局管理器无法猜测您想在哪里放置组件,因此您需要指定所有信息。这就是为什么您应该使用布局管理器的原因。然后,布局管理器将根据布局管理器的规则定位组件。稍加练习,就容易得多。