Java GridBagConstraints

我在JPanel中有5个组件。 我添加了前4个组件,一切看起来都很顺畅。 但是,当我尝试向JPanel添加第5个组件时,组件之间的间距会因任何原因而改变!

没有第5部分:

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); } 

获得此输出的原因是,这就是布局管理器的设计方式。

GridBagLayoutGridLayout的(虚拟)扩展。 事实上它将它的组件放在网格中,但比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来解决这个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

您可能需要仔细查看如何使用GridBagLayout获取更多详细信息……

最后一个JLabel未与前一个JLabel对齐的原因是所有标签都居中对齐并出现在同一列中。 当只有2个标签时,由于其FontMetric宽度相等的快乐巧合,它们看起来是对齐的。 添加第三个,标签显示交错。

要修复,您可以通过将组件锚定到GridBagConstraints.WEST并沿x轴设置权重来锚定标签以抵消此效果:

 gbc.weightx = 1; gbc.anchor = GridBagConstraints.WEST; 

这具有在GridBagLayout “单元格”内左对齐组件的效果。