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也很好。Swapf.setSize(1024768);
forf.pack()
对于+1。我希望+1是因为我在这个答案上的努力工作……但我不介意更改这行:)“这个答案上的努力工作”你是在暗示你是手工编写代码的吗?它看起来像是由GUI设计师制作的。;)是的,我是手工编写代码的。几年前我就停止使用GUI designer了,因为它们使得GUI设计在创建后很难发展。而且它们在与团队合作时会遇到阻碍。不过,它们对于原型设计和学习仍然很有用。我承认我偷了Matisse(Netbeans的GUI designer)的缩进风格生成。“是的,我是手工编写代码的。”(震惊)如果我的生活依赖于它,我就不能专心写GroupLayout
。太好了!Swapf.setSize(1024768);
forf.pack()
for a+1。我更希望+1是因为我在这个答案上的辛勤工作……但我不介意改变这句话:)“这个答案上的辛勤工作”你是在暗示你是手工编写代码的吗?它看起来像是由GUI设计师制作的。;)是的,我是手工编写代码的。几年前我就停止使用GUI designer了,因为它们使得GUI设计在创建之后很难发展。他们在与团队合作时会遇到阻碍。不过,它们对于原型设计和学习仍然很有用。我承认我偷了Matisse(Netbeans的GUI设计器)生成的缩进样式。“是的,我是手工编写代码的。”(震惊)如果我的生活依赖于它,我就无法专心编写GroupLayout
。荣誉