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());
大约一个月前我有一个 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());