“线程中的异常”;“主要”;java.lang.IllegalArgumentException:无法添加到布局:约束必须是GridBagConstraint

“线程中的异常”;“主要”;java.lang.IllegalArgumentException:无法添加到布局:约束必须是GridBagConstraint,java,swing,layout-manager,gridbaglayout,illegalargumentexception,Java,Swing,Layout Manager,Gridbaglayout,Illegalargumentexception,我正在为我的计算课程整理一个简单的基于文本的游戏,但是我在掌握如何使用AWTGridBagLayout和GridBagConstraints时遇到了一些问题 每次运行代码时,我都会收到以下错误消息: 这是我的GUI代码的副本: import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScroll

我正在为我的计算课程整理一个简单的基于文本的游戏,但是我在掌握如何使用AWT
GridBagLayout
GridBagConstraints
时遇到了一些问题

每次运行代码时,我都会收到以下错误消息:

这是我的GUI代码的副本:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.*;
@SuppressWarnings("unused")

public class GUI extends JFrame
{

    public void main(String[] args)
    {
        new GUI();
    }

    public GUI()
    {

        JFrame AG = new JFrame("Adventure Game");
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        setBounds(0, 0, screenSize.width, screenSize.height);
        setResizable(true);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel p=new JPanel();
        p.setLayout (new GridBagLayout());

        AG.add(p);
        GridBagConstraints GBC = new GridBagConstraints();
        AG.getContentPane().add(p, BorderLayout.NORTH);

        JButton saveButton =new JButton("Save");
        JButton loadButton =new JButton("Load");
        JButton optionsButton = new JButton("Options");

        JLabel textBox= new JLabel("Story line will go here.");

        JLabel label11 = new JLabel("Test 1");
        GBC.gridx = 0;
        GBC.gridy = 1;
        p.add(label11,AG);
        JLabel label12 = new JLabel("Test 2");
        GBC.gridx = 0;
        GBC.gridy = 2;
        p.add(label12,AG);
        JLabel label13 = new JLabel("Test 3");
        GBC.gridx = 0;
        GBC.gridy = 3;
        p.add(label13,AG);
        JLabel label14 = new JLabel("Test 4");
        GBC.gridx = 0;
        GBC.gridy = 4;
        p.add(label14,AG);

        add(p);
    }
}
我想问题是我试图使用
GridBagConstraints
而不使用
GridBagLayout
但我对java非常陌生,所以不知道如何使用
GridBagLayout
来解决问题,这些代码大部分来自我在youtube上看过的各种不同教程,但不只是模仿不同的人如何做,并试图把它混为一谈

谢谢你的帮助 -汤姆

主要问题 您正在传递
AG
,它是
JFrame
的一个实例,作为添加组件时的约束

p.add(label11, AG);
相反,您应该使用
GBC

p.add(label11, GBC);
public class GUI {

    public static void main(String[] args) {
        new GUI();
    }

    public GUI() {

        JFrame AG = new JFrame("Adventure Game");
        AG.setResizable(true);
        AG.setVisible(true);
        AG.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //...
setExtendedState(JFrame.MAXIMIZED_BOTH);
其他问题。。。 您的
GUI
是从
JFrame
扩展而来的,但是您正在in中创建另一个
JFrame
的实例,这非常令人困惑

通常建议您不要从顶级容器(如
JFrame
)进行扩展,因为您并没有真正向类添加新值,它将您锁定在单个容器中,从而降低了UI的可重用性

相反,请使用
JFrame
AG
)的新实例


您应该真正调用
setVisible
last,在构建核心接口之后,这将减少API更新组件的方式的潜在问题

    public GUI() {

        JFrame AG = new JFrame("Adventure Game");
        AG.setResizable(true);
        AG.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //...
        AG.setVisible(true);
    }

这个

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    setBounds(0, 0, screenSize.width, screenSize.height);
这是一种使窗口最大化的可怕方法,只需使用并传递它
JFrame。将两者最大化

p.add(label11, GBC);
public class GUI {

    public static void main(String[] args) {
        new GUI();
    }

    public GUI() {

        JFrame AG = new JFrame("Adventure Game");
        AG.setResizable(true);
        AG.setVisible(true);
        AG.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //...
setExtendedState(JFrame.MAXIMIZED_BOTH);

您应该学习并使用语言的通用命名约定,通读,这将使人们更容易阅读您的代码,您也更容易阅读他人的代码


Swing有一些重要的规则,其中之一是确保始终在事件调度线程的上下文中创建和修改UI

public GUI() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                ex.printStackTrace();
            }

            new GUI();
        }
    });
}
有关更多详细信息,请参阅


您的main方法应该声明为
static
,例如

public static void main(String[] args) {

否则该类将无法作为Java的主要入口点运行

请在代码块中发布堆栈跟踪,以便于阅读。此外,您的
main
方法必须是
static
。您的意思是什么?很抱歉,我对这一切都不熟悉。非常感谢,现在它已经修好了:P,我今天才刚开始看秋千的东西,所以我的大脑有点混乱,我可能应该用一些更独特的名字啊哈。我是否应该重新上传一个已修复的粘贴箱,以便其他有类似问题的人可以查看?除非我的回答没有解决问题。更改代码会使您难以确定原始问题是否与他们的问题匹配,以及答案是否确实回答了问题;)好的,谢谢你:P,谢谢你的帮助,这让我又省了一个小时对为什么它不起作用的困惑啊哈,你知道我可以买一些关于swing的好java书籍来帮助我学习吗?不知道,现在也不知道了。我总是推荐肮脏有钱的客户,但现在这可能有点过头了。你可以从非常抱歉这样的痛苦开始:P但是当我添加了AG.setDefaultCloseOperation(EXIT_ON_CLOSE)时;它产生了以下两个错误:错误:(29,37)java:/Users/thomastorburn/Documents/Adventure Game/src/GUI.java:29:找不到符号:变量EXIT\u ON\u CLOSE location:class GUI和错误:(61,9)java:/Users/thomastorburn/Documents/Adventure Game/src/GUI.java:61:找不到符号:方法add(javax.swing.JPanel)位置:类GUI