簡體   English   中英

將組件添加到我的GridBagLayout中會將其他組件移到右側

[英]Adding component to my GridBagLayout moves other components far to the right

當我嘗試布局JPanel時,我看到了一些非常奇怪的結果。 一切正常之前,我添加了最后JTextField subline

添加最后一個JTextField之前的正確布局

當我再補充一點,在JTextField它上面移動到右側,以便它開始的地方subline結束:

添加最后一個JTextField后布局不正確

這是創建此布局的代碼:

public class Opspanel extends JPanel{
    private static final long serialVersionUID = -6393281054430179953L;
    public Opspanel() {
        GridBagLayout layout = new GridBagLayout();
        setLayout(layout);
        GridBagConstraints constraints = new GridBagConstraints();

        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.LINE_START;
        add(new JLabel("Vendor ID"), constraints);

        constraints.gridx = 1;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.LINE_START;
        JTextField vendorid = new JTextField();
        vendorid.setPreferredSize(new Dimension(100,20));
        add(vendorid, constraints);

        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.anchor = GridBagConstraints.LINE_START;
        add(new JLabel("Email Date"), constraints);

        constraints.gridx = 1;
        constraints.gridy = 1;
        constraints.anchor = GridBagConstraints.LINE_START;
        JTextField emaildate = new JTextField();
        emaildate.setPreferredSize(new Dimension(100,20));
        add(emaildate, constraints);

        constraints.gridx = 2;
        constraints.gridy = 1;
        constraints.anchor = GridBagConstraints.LINE_START;
        add(new JLabel("Email Time"), constraints);

        constraints.gridx = 3;
        constraints.gridy = 1;
        constraints.anchor = GridBagConstraints.LINE_START;
        JTextField emailtime = new JTextField();
        emailtime.setPreferredSize(new Dimension(100,20));
        add(emailtime, constraints);

        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.anchor = GridBagConstraints.LINE_START;
        add(new JLabel("Subject Line"), constraints);

        constraints.gridx = 1;
        constraints.gridy = 2;
        constraints.anchor = GridBagConstraints.LINE_START;
        JTextField subline = new JTextField();
        subline.setPreferredSize(new Dimension(500, 20));
        add(subline, constraints);  

    }
}

我怎樣才能解決這個問題?

根據GridBagLayout的文檔

每個GridBagLayout對象維護一個動態的矩形單元格網格,每個組件占據一個或多個單元格,稱為其顯示區域。

在您的代碼中,網格有3行4列。 您要告訴每個組件在gridxgridy給定的位置恰好占據一個單元。

您可能不喜歡其中的某些“停止”或“開始”,這一事實表明您確實希望其中的一些占據一個以上的單元。

你真幸運! GridBagLayout可以做到這一點。 您正在尋找GridBagLayout.gridwidth

指定組件顯示區域中一行的單元格數。

使用REMAINDER可以指定組件的顯示區域是從gridx到行的最后一個單元格。 使用RELATIVE可以指定組件的顯示區域是從gridx到其行中最后一個區域的下一個區域。

gridwidth應該為非負值,默認值為1。


在您的示例中,將“主題行”文本字段放在第二列( gridx = 1 )。 由於您將gridwidth保留為其默認值1 ,因此該文本字段不能與第三或第四列重疊。 因此,如果增長,則整個列都必須隨之增長。

您可以通過覆蓋多個網格單元來填充整個水平空間。 (如果您熟悉Microsoft Excel或Microsoft Word或類似程序中的表,則類似於“合並單元格”選項。)

為了使其覆蓋3列,從gridx = 1

constraints.gridx = 1;
constraints.gridwidth = 3;

或者,使其覆蓋從列gridx = 1到右側的所有單元格:

constraints.gridx = 1;
constraints.gridwidth = GridBagLayout.REMAINDER;

只是不要忘記在使用它來添加另一個本應僅覆蓋一列的組件之前將gridwidth重置為1!

暫無
暫無

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

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