Java 如何正确使用GroupLayout移动组件/面板?

Java 如何正确使用GroupLayout移动组件/面板?,java,swing,Java,Swing,首先,我为这篇冗长的帖子道歉,我只是想澄清一下,并向你展示我的问题,以便更好地解决它 我有以下代码: JPanel panelCard = new JPanel(); String[] cards = {"VISA", "MASTERCARD", "DISCOVER"}; JComboBox cardType = new JComboBox(cards); panelCard.add(cardType); GroupLayout layout2 =

首先,我为这篇冗长的帖子道歉,我只是想澄清一下,并向你展示我的问题,以便更好地解决它

我有以下代码:

    JPanel panelCard = new JPanel();

    String[] cards = {"VISA", "MASTERCARD", "DISCOVER"};

    JComboBox cardType = new JComboBox(cards);

    panelCard.add(cardType);

    GroupLayout layout2 = new GroupLayout(panelCCInfo);

    panelCCInfo.setLayout(layout2);

    layout2.setAutoCreateGaps(true);
    layout2.setAutoCreateContainerGaps(true);

    GroupLayout.SequentialGroup hGroup2 = layout2.createSequentialGroup();

    hGroup2.addGroup(layout2.createParallelGroup()
            .addComponent(cardName)
            .addComponent(cardNumber)
            .addComponent(expDate));
    hGroup2.addGroup(layout2.createParallelGroup()
            .addComponent(cardNameField)
            .addComponent(cardNumberField)
            .addComponent(expDateField));
    hGroup2.addGroup(layout2.createParallelGroup()
            .addComponent(panelCard));
    layout2.setHorizontalGroup(hGroup2);

    GroupLayout.SequentialGroup vGroup2 = layout2.createSequentialGroup();

    vGroup2.addGroup(layout2.createParallelGroup(Alignment.BASELINE)
            .addComponent(cardName)
            .addComponent(cardNameField));
    vGroup2.addGroup(layout2.createParallelGroup(Alignment.BASELINE)
            .addComponent(cardNumber)
            .addComponent(cardNumberField));
    vGroup2.addGroup(layout2.createParallelGroup(Alignment.BASELINE)
            .addComponent(expDate)
            .addComponent(expDateField)
            .addComponent(panelCard));
    layout2.setVerticalGroup(vGroup2);

    panelCheckout.add(panelCCInfo, BorderLayout.CENTER);
当我运行它时,它会显示以下窗口:

但我想做到这一点:

当我尝试在panelCard中添加第三个垂直组时出现问题 守则:

    hGroup2.addGroup(layout2.createParallelGroup().addComponent(panelCard));
这似乎是因为2文本字段被切断,但我不希望它被切断

我能做些什么来实现第二张图片


非常感谢

好的,我用GridBagLayout和BorderLayout的复杂组合解决了这个问题


真是一团糟……)

好的,我用GridBagLayout和BorderLayout的复杂组合解决了这个问题

真是一团糟……)

以下是我的做法:

import javax.swing.*;
import static javax.swing.GroupLayout.*;
import static javax.swing.GroupLayout.Alignment.*;

public class Mastercard {

    public static void main(String[] args) {
        JLabel lblCardHolder = new JLabel("Card holder");
        JTextField tfCardHolder = new JTextField();
        JLabel lblCardNumber = new JLabel("Card number");
        JTextField tfCardNumber = new JTextField();
        JLabel lblExpirationDate = new JLabel("Expiration date");
        JTextField tfExpirationDate = new JTextField();
        JComboBox combo = new JComboBox(new String[]{"Visa"});

        JPanel panel = new JPanel();
        GroupLayout layout = new GroupLayout(panel);
        panel.setLayout(layout);

        layout.setAutoCreateContainerGaps(true);
        layout.setAutoCreateGaps(true);

        layout.setHorizontalGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup()
                    .addComponent(lblCardHolder)
                    .addComponent(lblCardNumber)
                    .addComponent(lblExpirationDate))
                .addGroup(layout.createParallelGroup()
                    .addComponent(tfCardHolder)
                    .addComponent(tfCardNumber)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(tfExpirationDate)
                        .addComponent(combo, DEFAULT_SIZE, 100, PREFERRED_SIZE))));

        layout.setVerticalGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(BASELINE)
                    .addComponent(lblCardHolder)
                    .addComponent(tfCardHolder))
                .addGroup(layout.createParallelGroup(BASELINE)
                    .addComponent(lblCardNumber)
                    .addComponent(tfCardNumber))
                .addGroup(layout.createParallelGroup(BASELINE)
                    .addComponent(lblExpirationDate)
                    .addComponent(tfExpirationDate)
                    .addComponent(combo)));

        JFrame f = new JFrame();
        f.setContentPane(panel);
        f.pack();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}
结果是:

GroupLayout
是一个功能强大的基于约束的布局管理器。在编写组布局时,基本上只需描述组件(或组件组)应按顺序还是并行放置。此描述针对水平轴和垂直轴独立完成

在水平方向上,按顺序有两组:标签组和其他组。其余部分由3个并行内容组成:2个文本字段和一系列
tfExpirationDate
combo
。这就是
layout.setHorizontalGroup(…
所描述的内容

垂直方向上,有3组按顺序排列:一组由标签和文本字段并行组成,另一组由标签和文本字段并行组成,还有一组由标签、文本字段和组合框并行组成。这就是
layout.setVerticalGroup(…
描述的内容

这些组和组件的嵌套非常重要,这就是我正确缩进所有内容的原因

我发现这种描述约束的方法很容易推理,只使用了两个概念:顺序组和平行组。与基于网格的布局相比,它的优点是每次添加或移动组件时不会破坏所有内容。

以下是我的做法:

import javax.swing.*;
import static javax.swing.GroupLayout.*;
import static javax.swing.GroupLayout.Alignment.*;

public class Mastercard {

    public static void main(String[] args) {
        JLabel lblCardHolder = new JLabel("Card holder");
        JTextField tfCardHolder = new JTextField();
        JLabel lblCardNumber = new JLabel("Card number");
        JTextField tfCardNumber = new JTextField();
        JLabel lblExpirationDate = new JLabel("Expiration date");
        JTextField tfExpirationDate = new JTextField();
        JComboBox combo = new JComboBox(new String[]{"Visa"});

        JPanel panel = new JPanel();
        GroupLayout layout = new GroupLayout(panel);
        panel.setLayout(layout);

        layout.setAutoCreateContainerGaps(true);
        layout.setAutoCreateGaps(true);

        layout.setHorizontalGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup()
                    .addComponent(lblCardHolder)
                    .addComponent(lblCardNumber)
                    .addComponent(lblExpirationDate))
                .addGroup(layout.createParallelGroup()
                    .addComponent(tfCardHolder)
                    .addComponent(tfCardNumber)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(tfExpirationDate)
                        .addComponent(combo, DEFAULT_SIZE, 100, PREFERRED_SIZE))));

        layout.setVerticalGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(BASELINE)
                    .addComponent(lblCardHolder)
                    .addComponent(tfCardHolder))
                .addGroup(layout.createParallelGroup(BASELINE)
                    .addComponent(lblCardNumber)
                    .addComponent(tfCardNumber))
                .addGroup(layout.createParallelGroup(BASELINE)
                    .addComponent(lblExpirationDate)
                    .addComponent(tfExpirationDate)
                    .addComponent(combo)));

        JFrame f = new JFrame();
        f.setContentPane(panel);
        f.pack();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}
结果是:

GroupLayout
是一个功能强大的基于约束的布局管理器。编写组布局时,您基本上只需描述组件(或组件组)应按顺序还是平行放置。此描述针对水平轴和垂直轴独立完成

在水平方向上,按顺序有两个组:标签组和其他组。其他组由3个平行的内容组成:2个文本字段,以及一系列
tfExpirationDate
combo
。这是
布局.setHorizontalGroup(…
描述的内容

垂直方向上,有3组按顺序排列:一组由标签和文本字段并行组成,另一组由标签和文本字段并行组成,还有一组由标签、文本字段和组合框并行组成。这就是
layout.setVerticalGroup(…
描述的内容

这些组和组件的嵌套非常重要,这就是我正确缩进所有内容的原因


我发现这种描述约束的方法很容易推理,只使用了两个概念:顺序组和平行组。与基于网格的布局相比,它的优点是每次添加或移动组件时不会破坏所有内容。

是否使用另一个
LayoutManager
选项?这是一个示例使用
FormLayout
(摘自JGoodies)就我而言,
GroupLayout
只是为UI构建者设计的。不手工编写其中的任何内容
GroupLayout
确实是在考虑UI构建者的情况下创建的,但我的经验是,手工编写UI也很好。使用另一个
LayoutManager
是一个选项吗?例如,对于mLayout(来自JGoodies)。
GroupLayout
就我而言只是为UI构建者设计的。不手工编写其中的任何内容
GroupLayout
的确是在考虑UI构建者的情况下创建的,但我的经验是,它对于手工编码的UI也很好。Swap
f.setSize(1024768);
for
f.pack()
对于+1。我希望+1是因为我在这个答案上的努力工作……但我不介意更改这行:)“这个答案上的努力工作”你是在暗示你是手工编写代码的吗?它看起来像是由GUI设计师制作的。;)是的,我是手工编写代码的。几年前我就停止使用GUI designer了,因为它们使得GUI设计在创建后很难发展。而且它们在与团队合作时会遇到阻碍。不过,它们对于原型设计和学习仍然很有用。我承认我偷了Matisse(Netbeans的GUI designer)的缩进风格生成。“是的,我是手工编写代码的。”(震惊)如果我的生活依赖于它,我就不能专心写
GroupLayout
。太好了!Swap
f.setSize(1024768);
for
f.pack()
for a+1。我更希望+1是因为我在这个答案上的辛勤工作……但我不介意改变这句话:)“这个答案上的辛勤工作”你是在暗示你是手工编写代码的吗?它看起来像是由GUI设计师制作的。;)是的,我是手工编写代码的。几年前我就停止使用GUI designer了,因为它们使得GUI设计在创建之后很难发展。他们在与团队合作时会遇到阻碍。不过,它们对于原型设计和学习仍然很有用。我承认我偷了Matisse(Netbeans的GUI设计器)生成的缩进样式。“是的,我是手工编写代码的。”(震惊)如果我的生活依赖于它,我就无法专心编写
GroupLayout
。荣誉