Java GridBag约束

标签 java swing gridbaglayout

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

最佳答案

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

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

生成

enter image description here

显然,您可以看到行和列。每行具有相同的高度,每列具有相同的宽度...

现在,如果我们添加下一个标签和字段...

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

这是您当前的问题...

enter image description here

您可以看到第一列的宽度已增加以适应新标签...

现在我们可以使用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 的位置必须增加,否则它实际上会位于标签上方!

enter image description here

现在,这样更好了,但是,我认为这不是您想要的: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);

enter image description here

最后:P - 简单如馅饼:D

您可能想仔细看看 How to use GridBagLayout了解更多详情...

关于Java GridBag约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15980712/

相关文章:

java - d 上的 UnknownHostException

java - 使用Timer在固定时间内重绘然后继续计算

Java Gridbagconstraints gridy 问题

java - 从 SVN 过渡到 Git(git-svn、工作区中的多个分支且无依赖管理)!

java - 我的 ExpirableLazyObject 不是线程安全的吗?有竞争条件吗?

java - 通过 Solrj 查询 Solr : Basics

java - 在内容 Pane 上绘制线条 Java swing

java - Java Web Start Swing App 如何显示 servlet 信息?

java - 布局方法在第一次执行后中断

java - GridBagLayout - 我的列数似乎比指定的少,但为什么?