“线程中的异常”;“主要”;java.lang.IllegalArgumentException:无法添加到布局:约束必须是GridBagConstraint
我正在为我的计算课程整理一个简单的基于文本的游戏,但是我在掌握如何使用AWT“线程中的异常”;“主要”;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
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