Java Swing`GridBagLayout`对齐问题

Java Swing`GridBagLayout`对齐问题,java,swing,user-interface,layout,gridbaglayout,Java,Swing,User Interface,Layout,Gridbaglayout,我正在尝试使用JavaSwing创建一个登录表单。但我希望布局看起来更紧凑,但仍然反应灵敏 我的项目结构 Project/ └── src ├── GUI │   ├── Control.java │   ├── Main.java │   └── pages │   ├── LoginPanel.java └── Helper └── Helpers.java 这是GUI的图片,这不是我想要的: 表单面板中的组件的行为

我正在尝试使用JavaSwing创建一个登录表单。但我希望布局看起来更紧凑,但仍然反应灵敏

我的项目结构

Project/
└── src
    ├── GUI
    │   ├── Control.java
    │   ├── Main.java
    │   └── pages
    │       ├── LoginPanel.java
    └── Helper
        └── Helpers.java
这是GUI的图片,这不是我想要的:

表单
面板中的组件的行为与我预期的不同,我希望字段靠近标签,但不要水平填充整个空间

我的代码是:

登录面板

package GUI.pages;
导入javax.swing.*;
公共类LoginPanel扩展了JPanel{
//一些标签、按钮、组和字段
私有静态JTextField usernameInputField;
私有静态JPasswordField passwordInputField;
私有静态JButton提交;
私有静态JLabel消息;
私有静态JButton registerRedirect=新JButton(“寄存器”);
私有静态最终整数填充=30;
公共登录面板(){
setLayout(新的BorderLayout());
JLabel title=Helpers.generateTile();
JPanel titleContainer=新的JPanel();
titleContainer.setLayout(新的FlowLayout(FlowLayout.LEFT,PADDING,PADDING));
标题容器。添加(标题);
//用户名行
JLabel usernamelab=新的JLabel(“用户名:”);
usernameInputField=newjtextfield(50);
//密码行
JLabel passwordLabel=新的JLabel(“密码:”);
passwordInputField=新的JPasswordField(50);
JPanel form=新的JPanel();
setLayout(新的GridBagLayout());
GridBagConstraints c=新的GridBagConstraints();
c、 网格宽度=2;
c、 gridx=0;
c、 gridy=0;
c、 锚点=GridBagConstraints.WEST;
c、 插图=新插图(0,20,0,0);
表单.add(usernamelab,c);
c=新的GridBagConstraints();
c、 gridx=0;
c、 gridy=1;
c、 锚点=GridBagConstraints.WEST;
c、 插图=新插图(0,20,0,0);
表格.add(密码标签,c);
c=新的GridBagConstraints();
c、 gridx=1;
c、 gridy=0;
c、 权重x=0.1;
c、 ipadx=200;
JPanel usernameFieldContainer=新的JPanel();
usernameFieldContainer.add(usernameInputField);
usernameFieldContainer.setSize(新维度(usernameInputField.getWidth()+10,usernameInputField.getHeight()+10));
表单.add(usernameFieldContainer,c);
c=新的GridBagConstraints();
c、 gridx=1;
c、 gridy=1;
c、 权重x=0.001;
c、 权重x=0.001;
c、 ipadx=50;
JPanel passwordFieldContainer=新的JPanel();
添加(passwordInputField);
设置大小(新维度(passwordInputField.getWidth()+10,passwordInputField.getHeight()+10));
表格.add(passwordFieldContainer,c);
//配置提交按钮
提交=新的JButton(“登录”);
submit.addActionListener(新的LoginActionListener());
submit.setActionCommand(“登录”);
JPanel submitContainer=新的JPanel();
submitContainer.setLayout(新的FlowLayout(FlowLayout.RIGHT,PADDING,PADDING));
submitContainer.add(提交);
//将所有内容添加到布局中
添加(标题容器,边框布局。页面\开始);
添加(表单、边框布局、行_开始);
添加(submitContainer,BorderLayout.PAGE_END);
}
}
主要

packagegui;
导入javax.swing.*;
导入GUI.pages.LoginPanel;
公共类主框架{
公共静态void main(字符串[]args){
JFrame=newmain();
}
公用干管(){
JPanel login_panel=new login panel();
添加(登录面板);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(真);
包装();
}
}
这就是我希望它看起来的样子(更新):

我希望字段靠近标签,但不要水平填充整个空间

不要试图设置窗口大小。所有Swing组件将确定其自己的首选尺寸。在调用setVisible(…)方法之前,将所有组件添加到框架和
pack()
框架中。然后,将根据所有组件的首选尺寸调整框架尺寸

private static JLabel usernameLabel;
private static JTextField usernameInputField;
不要使用静态变量。这不是静态关键字应该如何使用的

不需要为标签创建实例变量。通常,只有在希望变量在多个方法中被引用时,才创建实例变量。标签仅用于在表单上显示。文本字段将在按钮的ActionListener中引用,因此它们应该是实例变量

setSize(400, 400); 
不要试图设置大小。额外的垂直高度是因为您只使用400作为帧的随机高度。pack()方法将确定首选大小

usernameInputField = new JTextField(50);
...
passwordInputField = new JPasswordField(150);
构造函数中的数字将用于调整文本字段的大小,使其包含“W”字符。它不是像素。因此,您指定的值太大

c.fill = GridBagConstraints.HORIZONTAL;
不需要“填充”约束

form.setMaximumSize(new Dimension(200, passwordInputField.getHeight()));
无需指定最大大小

我还建议您可以使用
GridBagLayout
完成整个布局

对于第一行中的标签,您将使用
gridwidth=2
。最后一行中的按钮也是如此

然后,可以使用
锚定
约束控制行上标签/按钮的对齐。也就是说,是否希望标签居中,按钮右对齐

我希望字段靠近标签,但不要水平填充整个空间

不要试图设置窗口大小。所有Swing组件将确定其自己的首选尺寸。在调用setVisible(…)方法之前,将所有组件添加到框架和
pack()
框架中。然后,将根据所有组件的首选尺寸调整框架尺寸

private static JLabel usernameLabel;
private static JTextField usernameInputField;
不要使用静态变量。那是n
form.setMaximumSize(new Dimension(200, passwordInputField.getHeight()));