【发布时间】:2017-06-04 00:05:00
【问题描述】:
我已尽力修复 JLabel 的大小,但它一直在变化,这会导致 GUI 中的其他项目四处移动。
我已经指定了组件的大小和间距。根据 GridBagLayout 的documentation、ipadx 和ipady “指定内部填充:要添加多少到组件的大小。” 根据@987654322 @post、setMinimumSize 和setMaximumSize 允许您设置组件的实际大小。既然我已经固定了大小和间距,那么每当文本出现在 JLabel 中时,组件怎么可能一直跳来跳去?
在实践中我可以通过在空文本中添加一个空格来解决这个问题,但这一直困扰着我。这有什么我不明白的?
这是一个演示问题的 SSCCE。它具有排列在 GridBagLayout 中的元素,并且在一个单元格中更改一个 JLabel 的内容会导致所有项目移动。
import javax.swing.*;
import java.awt.*;
import java.io.*;
public class F {
public static void main(String[] args) throws IOException, InterruptedException {
JFrame frame = new JFrame();
JPanel mainView = new JPanel();
mainView.setPreferredSize(new Dimension(300, 300));
mainView.setLayout(new GridBagLayout());
JPanel contents = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(1,3,3,3);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.ipady = 2;
gbc.anchor = GridBagConstraints.EAST;
JLabel text1 = new JLabel("Some text: ");
contents.add(text1, gbc);
gbc.gridy++;
JLabel text2 = new JLabel("More text: ");
contents.add(text2, gbc);
gbc.gridy++;
JLabel text3 = new JLabel("Third line: ");
contents.add(text3, gbc);
gbc.gridx++;
gbc.gridy = 0;
JTextField textField1 = new JTextField(10);
contents.add(textField1, gbc);
gbc.gridx++;
gbc.gridy++;
gbc.gridx--;
JTextField textField2 = new JTextField(10);
contents.add(textField2, gbc);
gbc.gridy++;
JLabel sitePass = new JLabel("");
sitePass.setMaximumSize(new Dimension(100, 15));
sitePass.setMinimumSize(new Dimension(100, 15));
//sitePass.setPreferredSize(new Dimension(100, 15)); // <-- this line fixes the problem
contents.add(sitePass, gbc);
mainView.add(contents);
frame.add(mainView);
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
while (true) {
Thread.sleep(1000);
sitePass.setText("Pushup time");
Thread.sleep(1000);
sitePass.setText("");
}
}
}
【问题讨论】:
-
你的minimal reproducible example在哪里? PS:
setPreferedSize(int)可以帮助(我将三个prefered, minimal, maximal设置为相同的值)来固定大小 -
对不起这个例子,我在尝试创建一个最小的例子时不小心删除了太多。
-
你说得对, minimumSize 和 maximumSize 是不够的。添加 preferredSize 修复了它。
标签: java swing user-interface layout-manager gridbaglayout