我的 JPanel 中有 5 个组件。 我添加的前 4 个组件看起来一切都很顺利。 但是,当我尝试向 JPanel 添加第五个组件时,组件之间的间距由于某种原因发生了变化!
没有第五个组件:
First Name: [..............]
Last Name: [..............]
与:
First Name:---------------- [.............]
Last Name:----------------- [.............]
What is your favorite sport:
假设标签和文本字段之间的破折号是空格
标签和文本字段之间的间距发生变化! 这是我的代码,请帮助我!
public static void main(String[] args)
{
JFrame frame = new JFrame("Survey");
frame.setSize(800, 600);
frame.setLayout(new FlowLayout(FlowLayout.CENTER));
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p1 = new JPanel(new GridBagLayout());
//LINE.START = Top Left Corner
frame.add(p1);
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 5, 10, 10);
JLabel lblFirstN = new JLabel("First Name:");
JLabel lblLastN = new JLabel("Last Name:");
JLabel lblFavSport = new JLabel("What is your favorite sport:");
JTextField txtFirstN = new JTextField();
txtFirstN.setPreferredSize(new Dimension(100, 20));
JTextField txtLastN = new JTextField();
txtLastN.setPreferredSize(new Dimension(100, 20));
gbc.gridx = 0;
gbc.gridy = 0;
p1.add(lblFirstN, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
p1.add(txtFirstN, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
p1.add(lblLastN, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
p1.add(txtLastN, gbc);
//this block of code is what is screwing me
gbc.gridx = 0;
gbc.gridy = 2;
p1.add(lblFavSport, gbc);
}
最佳答案
您获得此输出的原因是,这就是布局管理器的设计方式。
GridBagLayout
是 GridLayout
的(虚拟)扩展。事实上,它将组件放置在网格中,但比 GridLayout 灵活得多。这是您将在包含的布局管理器中获得类似 HTML 表格之类的内容的关闭。
让我们仔细看看。以下代码...
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("First Name"), gbc);
gbc.gridy++;
add(new JLabel("Last Name"), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
add(new JTextField(15), gbc);
gbc.gridy++;
add(new JTextField(15), gbc);
生成
显然,您可以看到行和列。每行具有相同的高度,每列具有相同的宽度...
现在,如果我们添加下一个标签和字段...
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("First Name"), gbc);
gbc.gridy++;
add(new JLabel("Last Name"), gbc);
gbc.gridy++;
add(new JLabel("What is your favorite sport:"), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
add(new JTextField(15), gbc);
gbc.gridy++;
add(new JTextField(15), gbc);
gbc.gridy++;
add(new JTextField(15), gbc);
这是您当前的问题...
您可以看到第一列的宽度已增加以适应新标签...
现在我们可以使用gridWidth
来解决这个问题...
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("First Name"), gbc);
gbc.gridy++;
add(new JLabel("Last Name"), gbc);
gbc.gridy++;
gbc.gridwidth = 2;
add(new JLabel("What is your favorite sport:"), gbc);
gbc.gridwidth = 1;
gbc.gridx = 1;
gbc.gridy = 0;
add(new JTextField(15), gbc);
gbc.gridy++;
add(new JTextField(15), gbc);
gbc.gridx = 2;
gbc.gridy++;
add(new JTextField(15), gbc);
nb:最后一个字段 gridx
的位置必须增加,否则它实际上会位于标签上方!
现在,这样更好了,但是,我认为这不是您想要的:P
我们还需要调整前两个字段以跨越到下一个单元格...
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("First Name"), gbc);
gbc.gridy++;
add(new JLabel("Last Name"), gbc);
gbc.gridy++;
gbc.gridwidth = 2;
add(new JLabel("What is your favorite sport:"), gbc);
gbc.gridwidth = 2;
gbc.gridx = 1;
gbc.gridy = 0;
add(new JTextField(15), gbc);
gbc.gridy++;
add(new JTextField(15), gbc);
gbc.gridx = 2;
gbc.gridy++;
add(new JTextField(15), gbc);
最后:P - 简单如馅饼:D
您可能想仔细看看 How to use GridBagLayout了解更多详情...
关于Java GridBag约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15980712/