簡體   English   中英

使用GridBagLayout將JPanel內部的組件居中

[英]Center components inside JPanel using GridBagLayout

我試圖將某些組件放在JPanel內部,當我在JPanel的GridBagLayout的“ Customize Layout”選項中按“ Test Layout”時,一切正常,但是當我運行該程序時,它看起來有所不同。

它看起來應該像這樣: 在此處輸入圖片說明

相反,當我運行程序時,它看起來像這樣:

在此處輸入圖片說明

該程序的結構如下:

在此處輸入圖片說明

因此,存在兩個問題:

  1. 密碼字段大於電子郵件地址字段。 我嘗試將兩者的最小值,最大值和首選大小都設置為(14,22),但它不起作用。

  2. 為什么將按鈕分開,如何使它們連接? (右鍵具有0個左Inset)

這是initComponents()函數:

private void initComponents()
    {
        java.awt.GridBagConstraints gridBagConstraints;

        jPanel1 = new javax.swing.JPanel();
        loginButton = new javax.swing.JButton();
        signUpLabel = new javax.swing.JLabel();
        emailTextField = new javax.swing.JTextField();
        passwordField = new javax.swing.JPasswordField();
        star1 = new javax.swing.JLabel();
        star2 = new javax.swing.JLabel();
        loginToggleButton = new javax.swing.JToggleButton();
        signUpToggleButton = new javax.swing.JToggleButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBackground(new java.awt.Color(42, 46, 55));
        jPanel1.setLayout(new java.awt.GridBagLayout());

        loginButton.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N
        loginButton.setText("Login");
        loginButton.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                loginButtonActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.ipadx = 42;
        gridBagConstraints.ipady = 14;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(79, 116, 0, 0);
        jPanel1.add(loginButton, gridBagConstraints);

        signUpLabel.setFont(new java.awt.Font("Dialog", 1, 13)); // NOI18N
        signUpLabel.setText("Don't have an account?");
        signUpLabel.setPreferredSize(new java.awt.Dimension(149, 12));
        signUpLabel.addMouseListener(new java.awt.event.MouseAdapter()
        {
            public void mouseClicked(java.awt.event.MouseEvent evt)
            {
                signUpLabelMouseClicked(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt)
            {
                signUpLabelMouseEntered(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt)
            {
                signUpLabelMouseExited(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 6;
        gridBagConstraints.gridwidth = 3;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 100, 42, 0);
        jPanel1.add(signUpLabel, gridBagConstraints);

        emailTextField.setMaximumSize(new java.awt.Dimension(14, 22));
        emailTextField.setMinimumSize(new java.awt.Dimension(14, 22));
        emailTextField.setPreferredSize(new java.awt.Dimension(14, 22));
        emailTextField.addFocusListener(new java.awt.event.FocusAdapter()
        {
            public void focusGained(java.awt.event.FocusEvent evt)
            {
                emailTextFieldFocusGained(evt);
            }
            public void focusLost(java.awt.event.FocusEvent evt)
            {
                emailTextFieldFocusLost(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.gridwidth = 6;
        gridBagConstraints.gridheight = 2;
        gridBagConstraints.ipadx = 199;
        gridBagConstraints.ipady = 10;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(97, 70, 0, 0);
        jPanel1.add(emailTextField, gridBagConstraints);

        passwordField.setMaximumSize(new java.awt.Dimension(14, 22));
        passwordField.addFocusListener(new java.awt.event.FocusAdapter()
        {
            public void focusGained(java.awt.event.FocusEvent evt)
            {
                passwordFieldFocusGained(evt);
            }
            public void focusLost(java.awt.event.FocusEvent evt)
            {
                passwordFieldFocusLost(evt);
            }
        });
        passwordField.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                passwordFieldActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.gridwidth = 6;
        gridBagConstraints.gridheight = 2;
        gridBagConstraints.ipadx = 199;
        gridBagConstraints.ipady = 10;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 70, 0, 0);
        jPanel1.add(passwordField, gridBagConstraints);

        star1.setForeground(new java.awt.Color(255, 0, 0));
        star1.setText("*");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 6;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(106, 10, 0, 49);
        jPanel1.add(star1, gridBagConstraints);

        star2.setForeground(new java.awt.Color(255, 0, 0));
        star2.setText("*");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 6;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(25, 10, 0, 49);
        jPanel1.add(star2, gridBagConstraints);

        loginToggleButton.setBackground(new java.awt.Color(0, 224, 208));
        loginToggleButton.setText("Log In");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.ipadx = 34;
        gridBagConstraints.ipady = 8;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(44, 0, 0, 0);
        jPanel1.add(loginToggleButton, gridBagConstraints);

        signUpToggleButton.setBackground(new java.awt.Color(48, 199, 32));
        signUpToggleButton.setText("Sign Up");
        signUpToggleButton.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                signUpToggleButtonActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.ipadx = 25;
        gridBagConstraints.ipady = 8;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(44, 80, 0, 0);
        jPanel1.add(signUpToggleButton, gridBagConstraints);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        pack();
    }// </editor-fold>

不要使用setPreferredSize()。

每個Swing組件將根據組件的屬性確定自己的大小。 在許多情況下,這將基於組件的文本。

對於沒有默認文本的文本字段,您應該創建以下組件:

//emailTextField = new javax.swing.JTextField();
//passwordField = new javax.swing.JPasswordField();
emailTextField = new javax.swing.JTextField(20);
passwordField = new javax.swing.JPasswordField(10);

因此,組件可以確定其首選大小以顯示20/10個字符。 (實際上,它的大小可以顯示“ W”字符)。

另外,通常不需要設置組件的最小/最大大小,因為GridBagLayout將遵循首選大小,除非您填充單元格。

您是否嘗試過使用其他gridBagConstraints變量? 否則,兩個不同的組件可能會導致一些問題。

public class TestStack {
private static JTextField txtOne;
private static JTextField txtTwo;

public static void main(String[] args) {
    JFrame frame = new JFrame();
    GridBagLayout gridBagLayout = new GridBagLayout();
    gridBagLayout.columnWidths = new int[]{0, 0};
    gridBagLayout.rowHeights = new int[]{0, 0, 0, 0};
    gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
    gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
    frame.getContentPane().setLayout(gridBagLayout);

    txtOne = new JTextField();
    txtOne.setHorizontalAlignment(SwingConstants.CENTER);
    txtOne.setText("one");
    GridBagConstraints gbc_txtOne = new GridBagConstraints();
    gbc_txtOne.insets = new Insets(0, 0, 5, 0);
    gbc_txtOne.gridx = 0;
    gbc_txtOne.gridy = 0;
    frame.getContentPane().add(txtOne, gbc_txtOne);
    txtOne.setColumns(10);

    txtTwo = new JTextField();
    txtTwo.setHorizontalAlignment(SwingConstants.CENTER);
    txtTwo.setText("twodwqadadsadasdsa");
    GridBagConstraints gbc_txtTwo = new GridBagConstraints();
    gbc_txtTwo.insets = new Insets(0, 0, 5, 0);
    gbc_txtTwo.gridx = 0;
    gbc_txtTwo.gridy = 1;
    frame.getContentPane().add(txtTwo, gbc_txtTwo);
    txtTwo.setColumns(10);

    JLabel lblThree = new JLabel("three");
    lblThree.setHorizontalAlignment(SwingConstants.CENTER);
    GridBagConstraints gbc_lblThree = new GridBagConstraints();
    gbc_lblThree.gridx = 0;
    gbc_lblThree.gridy = 2;
    frame.getContentPane().add(lblThree, gbc_lblThree);
    frame.setVisible(true);
}
}

試試吧

我不確定密碼字段,但是對於分開的按鈕,您可以使用框式布局創建一個新面板。 然后,您可以在其中放置按鈕。 之后,您可以將新面板放入主面板中。 這在我當前的項目中有效。 希望它也對您有用。

暫無
暫無

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

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