簡體   English   中英

如何正確使用GroupLayout移動組件/面板?

[英]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個文本字段以及一系列 tfExpirationDatecombo 用簡單的英語來說,這就是layout.setHorizontalGroup(...所描述的。

垂直,有3組在序列 :一個標簽的組成和平行的文本字段,另一個標簽的組成和平行的文本字段,和另一個標簽,文本字段和並聯的組合框組成。 這就是layout.setVerticalGroup(...所描述的。

這些組和組件的嵌套很重要,這就是為什么我正確縮進所有內容的原因。

我發現這種描述約束的方法很容易推理,僅使用兩個概念:順序組和並行組。 與基於網格的布局相比,它的優點是您每次想要添加或移動組件時都不會破壞所有內容。

好吧,我使用GridBagLayout和BorderLayout的復雜組合弄清楚了

真是一團糟.... :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM