GroupLayout 问题:调整大小时组件突然 "burst" window

Problem with GroupLayout: components suddenly "burst" when resizing window

大约一个月前我有一个 Java 作业,是关于构建 GUI 的。我使用 GroupLayout 来管理组件的位置。我 运行 遇到一个问题,如果我将很长的文本字符串放入 JTextField 并调整外部 window 的大小,文本字段突然“爆裂”。

我使用 GridBagLayout 解决了这个问题,但我想回到原来的问题,希望能更好地理解 GroupLayout。

这是演示此问题的 SSCCE。 (我尽量减少它,如果我的例子太长,我深表歉意。)

import javax.swing.*;
import java.awt.*;

public class Main extends JFrame {
    JTextField text1;
    JTextField text2;
    JPanel myPanel;

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(() -> new Main());
    }

    public Main() {
        super("Sussy Imposter");

        createComponents();
        setLayout();
        configureSettings();
    }

    public void createComponents() {
        text1 = new JTextField(20);
        text2 = new JTextField(20);
        text1.setMaximumSize(text1.getPreferredSize());
        text2.setMaximumSize(text2.getPreferredSize());

        myPanel = new JPanel();
        myPanel.setBackground(Color.CYAN);
        myPanel.setPreferredSize(new Dimension(100, 100));
    }

    public void setLayout() {
        Container c = getContentPane();
        GroupLayout groupLayout = new GroupLayout(c);
        c.setLayout(groupLayout);

        groupLayout.setAutoCreateGaps(true);
        groupLayout.setAutoCreateContainerGaps(true);
        groupLayout.setHorizontalGroup(
            groupLayout.createSequentialGroup()
            .addComponent(myPanel)
            .addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addComponent(text1)
                .addComponent(text2))
        );
        groupLayout.setVerticalGroup(
            groupLayout.createParallelGroup()
                .addComponent(myPanel)
                .addGroup(groupLayout.createSequentialGroup()
                    .addComponent(text1)
                    .addComponent(text2))
        );
    }

    public void configureSettings() {
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}

当我将此文本 Let me send you to space Space travel ASMR Roleplay (Eng)(Kor) | Roleplay, Storytime, Whitenoise 复制粘贴到其中一个文本字段中,并调整外部 window 的大小时,文本字段“突发”。

我在 createComponents() 中将文本字段的最大大小设置为它们的首选大小,所以我不明白为什么当我调整 window 时文本字段的大小超过了它的最大大小].

谁能解释为什么我会出现这种奇怪的行为?

编辑:我重写了 paint() 方法以查看文本字段大小的宽度如何变化。

public void paint(Graphics g) {
    super.paint(g);
    System.out.printf("min: %d\n", text1.getMinimumSize().width);
    System.out.printf("pre: %d\n", text1.getPreferredSize().width);
    System.out.printf("max: %d\n", text1.getMaximumSize().width);
}

调整大小前的输出

min: 5
pre: 224
max: 224

调整大小后的输出

min: 569
pre: 224
max: 224

正如@matt 在评论中指出的那样,这似乎是因为 minimumSize 变得非常大。更值得注意的是,minimumSize 增长大于 preferredSize 和 maximumSize,这是非常意外的。

编辑: 最小大小的行为,调整大小后增长,变得大于最大大小似乎是一个错误。
明确设置最小大小是一种解决方法:

.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
    .addComponent(text1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
    .addComponent(text2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))

这会将组件的最小和最大大小设置为默认大小,如 documentation 中所述:

To make a component fixed size (suppress resizing): group.addComponent(component, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)

您可以通过设置 min 以及最大尺寸来实现相同的行为:

text1.setMinimumSize(text1.getPreferredSize());
text1.setMaximumSize(text1.getPreferredSize());