java - 在 Java 中实现 GridBagLayout 的问题

标签 java layout awt layout-manager gridbaglayout

我正在尝试在 Java 中实现 GridBagLayout 以用于我必须为我正在构建的程序制作的登录对话框。我打算使用干净的 Google 登录。我遇到的主要问题是我使用 GridBagConstraints 设置的约束不起作用。这是我希望对话框的样子。

A simple sign in dialog using java

这是我要实现的对话框的代码。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Login_Dialog extends JDialog{

    // SEtting up the required components for the sign in

    /**
     * 
     */
    private static final long serialVersionUID = 1L;


    protected JLabel username_Label = new JLabel("Username");
    protected JLabel password_Label = new JLabel("Username");

    protected JTextField username_Field = new JTextField(30);
    protected JTextField password_Field = new JTextField(30);

    protected JButton sign_In = new JButton("Sign in!");

    public Login_Dialog() {
        setSize(600,400);
        setTitle("Sign in");

        setLayout(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();

        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;

        add(username_Label);

        c.fill = GridBagConstraints.HORIZONTAL;
//      c.weightx = 0.5;
        c.gridx = 1;
        c.gridy = 0;

        add(username_Field);

        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 2;

        add(password_Label);

        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 4;

        add(password_Field);

        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 5;

        add(sign_In);

        setVisible(true);

    }

}

更新:

我做了一些改变,看起来我达到了我想要的结果。现在的问题是一切都居中并且按钮的长度太宽了。另外,我希望文本字段和标签更大。

这是 GridBagLayout 的更新

//cusotmization of buttons
        Dimension signD = sign_In.getPreferredSize();
        signD.height = 50;
        signD.width = 30;

        sign_In.setPreferredSize(signD);


        GridBagConstraints c = new GridBagConstraints();

        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;

        add(username_Label,c);

        c.fill = GridBagConstraints.HORIZONTAL;
//      c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 1;

        add(username_Field,c);

        c.fill = GridBagConstraints.HORIZONTAL;
//      c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 2;

        add(password_Label,c);

        c.fill = GridBagConstraints.HORIZONTAL;
//      c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 3;

        add(password_Field,c);
//      
//      c.fill = GridBagConstraints.HORIZONTAL;
//      c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 5;
//      
        add(sign_In,c);

最佳答案

您必须在 add()

中添加约束对象

示例:

add(username_Field, c);

c 是您的 GridBagConstraint。

这是一个完整的例子:

package gui;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

@SuppressWarnings("serial")
public class LoginPanel extends JPanel
{
    private static final Dimension TFIELD_SZ = new Dimension(120, 20);

    public LoginPanel()
    {
        super(new GridBagLayout());

        final GridBagConstraints cst = new GridBagConstraints();
        cst.insets = new Insets(0, 5, 0, 5);
        cst.weightx = 0.5;
        cst.weighty = 0.5;
        cst.anchor = GridBagConstraints.LINE_START;

        // Username
        cst.gridx = 0;
        cst.gridy = 0;
        this.add(new JLabel("Username:"), cst);
        cst.gridy = 1;
        cst.gridwidth = 2;
        final JTextField uTField = new JTextField();
        uTField.setMinimumSize(TFIELD_SZ);
        uTField.setPreferredSize(TFIELD_SZ);
        this.add(uTField, cst);

        // Password
        cst.gridwidth = 1;
        cst.gridy = 2;
        this.add(new JLabel("Password:"), cst);
        cst.gridy = 3;
        cst.gridwidth = 2;
        final JTextField pwTField = new JTextField();
        pwTField.setMinimumSize(TFIELD_SZ);
        pwTField.setPreferredSize(TFIELD_SZ);
        this.add(pwTField, cst);

        // Buttons
        cst.anchor = GridBagConstraints.CENTER;
        cst.gridy = 4;
        cst.gridwidth = 1;
        this.add(new JButton("Sign in"), cst);
        cst.gridx = 1;
        this.add(new JButton("Sign up"), cst);

    }

    public static void main(final String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                final JDialog myDialog = new JDialog();
                myDialog.setTitle("Sign in");
                myDialog.setSize(180, 170);
                myDialog.setContentPane(new LoginPanel());
                myDialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
                myDialog.setVisible(true);
            }
        });
    }
}

关于java - 在 Java 中实现 GridBagLayout 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16086649/

相关文章:

java - 获取特定枚举的类型

java - 删除水平进度条中的填充

java - 通过事件处理插入图像?

java - 显示 BufferedImage 后如何对其进行编辑?

java - Tomcat 不接受 Ubuntu 中的 JAVA_HOME

java - 用java加载缓存中的数据

java - 如何从(静态)类中的类创建新的类实例?

css - Bootstrap 3基于框的布局填充而不影响装订线

android - 如何自定义 Android 中的内置小部件(菜单、通知、微调器等)?

Java Canvas 大小问题