gpt4 book ai didi

java - 线程中的异常 "main"java.lang.IllegalArgumentException : cannot add to layout: constraints must be a GridBagConstraint

转载 作者:行者123 更新时间:2023-12-02 05:15:19 26 4
gpt4 key购买 nike

我正在为我的计算类(class)纠正一个简单的基于文本的游戏,但我在掌握如何使用 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 为了解决这个问题,大部分代码来 self 在 youtube 上看过的各种不同的教程,但不是复制的,只是采用了不同人的做法并试图将其糟糕地混合起来

感谢您的帮助- 汤姆

最佳答案

主要问题

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

p.add(label11, AG);

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

p.add(label11, GBC);

其他问题...

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

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

相反,坚持使用 JFrame 的新实例( AG )...

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最后,在构建核心接口(interface)之后,这将减少 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 有一些重要的规则,其中之一是确保您始终在事件分派(dispatch)线程的上下文中创建和修改 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 的主入口点运行

关于java - 线程中的异常 "main"java.lang.IllegalArgumentException : cannot add to layout: constraints must be a GridBagConstraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27006427/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com