拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 GroupLayout的问题:调整视窗大小时组件突然“爆裂”

GroupLayout的问题:调整视窗大小时组件突然“爆裂”

白鹭 - 2022-02-11 2421 0 0

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

我使用 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);
    }
}

GroupLayout 的问题:调整视窗大小时组件突然“爆裂”

当我将此文本复制粘贴Let me send you to space ??Space travel ASMR Roleplay ??(Eng)(Kor) | Roleplay, Storytime, Whitenoise到其中一个文本栏位中并调整外部视窗的大小时,文本栏位会“爆裂”。

GroupLayout 的问题:调整视窗大小时组件突然“爆裂”

我已将文本栏位的最大大小设定为它们的首选大小createComponents(),所以我不明白为什么当我调整视窗大小时文本栏位的大小超过其最大大小。

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

编辑:我已经重写了该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,这是非常出乎意料的。

uj5u.com热心网友回复:

编辑:最小尺寸的行为,在调整大小后增长,并变得大于最大尺寸似乎是一个错误。
显式设定最小大小是一种解决方法:

.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))

这会将组件的最小和最大尺寸设定为默认尺寸,如档案中所述

您可以通过设定最小和最大尺寸来实作相同的行为

text1.setMinimumSize(text1.getPreferredSize());
text1.setMaximumSize(text1.getPreferredSize());
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *