[英]How do I use GroupLayout properly to move components/panels?
首先,我對冗長的帖子表示歉意,我只是想清楚一點,向您展示我的問題,以便更好地解決它。
我有以下代碼:
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文本字段被切斷了,但是我不希望它被切斷。
我怎樣才能獲得第二張照片?
非常感謝!
這是我的做法:
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
是一個功能強大的基於約束的布局管理器。 在編寫組布局時,基本上只描述了組件(或組件組)是應順序放置還是並行放置。 該描述是針對水平軸和垂直軸獨立進行的。
在水平方向上,有2組依次排列 :標簽和其余組。 其余部分由3個並行的事物組成:2個文本字段以及一系列 tfExpirationDate
和combo
。 用簡單的英語來說,這就是layout.setHorizontalGroup(...
所描述的。
垂直,有3組在序列 :一個標簽的組成和平行的文本字段,另一個標簽的組成和平行的文本字段,和另一個標簽,文本字段和並聯的組合框組成。 這就是layout.setVerticalGroup(...
所描述的。
這些組和組件的嵌套很重要,這就是為什么我正確縮進所有內容的原因。
我發現這種描述約束的方法很容易推理,僅使用兩個概念:順序組和並行組。 與基於網格的布局相比,它的優點是您每次想要添加或移動組件時都不會破壞所有內容。
好吧,我使用GridBagLayout和BorderLayout的復雜組合弄清楚了
真是一團糟.... :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.