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

时间:2014-11-18 23:51:46

标签: java swing layout-manager gridbaglayout illegalargumentexception

我正在为我的计算课程修正一个简单的基于文本的游戏,但我在掌握如何使用AWT GridBagLayoutGridBagConstraints方面遇到了一些问题。

当我运行代码时,我收到此错误消息:

enter image description here

以下是我的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上观看过的各种不同的教程,但没有复制只是考虑了各种各样的人如何做并试图将它混合得很糟糕

感谢您的帮助 - 汤姆

1 个答案:

答案 0 :(得分:2)

主要问题

您正在传递AG,这是JFrame的一个实例,作为添加组件时的约束...

p.add(label11, AG);

相反,您应该使用GBC ...

p.add(label11, GBC);

其他问题......

您的GUI已从JFrame延伸,但您正在创建另一个JFrame的实例,这非常令人困惑......

通常建议您不要从顶级容器(例如JFrame)进行扩展,因为您并未真正向类中添加新值,而是将您锁定到单个容器中,降低了用户界面的可重用性

相反,请坚持使用JFrameAG)...

的新实例
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);
        //...

在构建核心界面之后,你应该最后调用setVisible,这将减少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#setExtendedState并将其传递给JFrame.MAXIMIZED_BOTH ...

setExtendedState(JFrame.MAXIMIZED_BOTH);

您应该学习并使用语言的常见命名约定,阅读Code Conventions for the Java TM Programming Language,这将使人们更容易阅读您的代码并让您阅读其他人


Swing有一些重要的规则,其中一个规则是确保始终在Event Dispatching Thread的上下文中创建和修改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();
        }
    });
}

有关详细信息,请参阅Initial Threads


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

public static void main(String[] args) {

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