Java Swing - 尺寸错误

3

我有一个问题。我在Java Eclipse SDK 4.2.1中编写了这段代码,由于篇幅原因我没有全部展示,现在actionPerformed方法不相关,从Main中调用。问题是有时候当我运行它时,其中一个组件会填充整个窗口并覆盖其他所有组件。我尝试通过随机数字更改大小,例如从400到350,有时它可以正常工作,然后又会出现问题。我可能遗漏了某些东西,但我不知道是什么。我搜索了其他论坛,但没有找到任何相关信息。

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collections;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;


public class Window extends JFrame implements ActionListener
{
    JTextField field1;
    JTextField field2;

    public Window()
    {
        super("Main Window");
        setVisible(true);
        setSize(500, 500);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Initialize();
    }
    private void Initialize()
    {
        field1 = new JTextField();
        field2 = new JTextField();
        field1.setBounds(0, 0, 400, 100);
        field2.setBounds(0,100,400,100);
        add(field1);
        add(field2);
        field1.setBackground(Color.PINK);
        field1.setForeground(Color.RED);
        field2.setBackground(Color.PINK);
        field2.setForeground(Color.RED);
        JButton button = new JButton("Create");
        button.setBounds(0, 200, 400, 100);
        add(button);
        button.setBackground(Color.BLACK);
        button.setForeground(Color.YELLOW);
        button.addActionListener(this);

    }

"然后它又崩溃了"。从代码为框架设置显式大小和测试字段的边界开始,它就已经出现了问题。此外,请确保GUI在EDT上构建。为了更快地获得帮助,请发布一个SSCCE - Andrew Thompson
顺便提一句,"SDK 4.2.1",我最初把那个数字读成了'1.4.2'。Java版本的'4.2.1'是什么? - Andrew Thompson
1
顺便提一下,那个GUI似乎试图将3个组件放在等大小单元格的垂直列中。使用GridLayout - 它非常适合这种用途。 - Andrew Thompson
@Andrew,4.2.1是Eclipse的版本号。我不确定这是否很重要,但在相关范围内,我尽可能提供了更多的信息。 - Gasert
我可能误解了你。你是不是最近(在过去的一个月内)写了这段代码? - Andrew Thompson
是的,我只是刚开始接触Java,并且还没有找到正确的在线教程。 - Gasert
1个回答

4
你的问题在于你的代码没有考虑到正在使用的布局管理器,因为当你试图添加组件时,它们好像是null布局,但实际上并不是。解决方法是阅读和学习有关布局管理器的知识,并使用它们;这包括避免调用setBounds(...)。请注意,JFrame的contentPane默认使用BorderLayout布局。这些信息应该可以帮助你入门。另请注意,使用null布局是错误的解决方案。因此,如果有人建议这样做,请忽略他们。

1
请注意,框架的默认布局从FlowLayout更改为BordeLayout。我提到这一点是因为1)用户在1.4中制作了应用程序(不确定何时发生更改),2)更改SNAFU'd了许多假定流布局的GUI。这就是为什么我通常更喜欢设置内容窗格。我们可以选择Border和布局 - 没有那些类型的意外。 - Andrew Thompson
2
我在99年开始使用Java,当时的JDK版本是1.4,而默认布局管理器是BorderLayout。 - camickr
@camickr 谢谢确认。我确信它在某个时候改变了,但是找不到任何参考资料。现在看来,我对“在1.4中编译”做出的假设无论如何都是错误的。 - Andrew Thompson
谢谢您的快速回答,我还没有尝试过,因为我不在家。但我相信你是对的。您知道有什么在线指南可以推荐给像我这样的初学者吗? - Gasert
@Gasert:标准的Oracle Java教程中有一个Swing部分,该Swing部分包含布局部分。我手头没有链接,但可以通过谷歌快速获取(您也可以)。祝好运! - Hovercraft Full Of Eels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接