Java Swing 登录表单

Posted

技术标签:

【中文标题】Java Swing 登录表单【英文标题】:Java Swing Login Form 【发布时间】:2021-06-17 23:09:28 【问题描述】:

我正在尝试使用 Java Swing 创建登录表单。但我希望布局看起来更紧凑,但仍然响应迅速。

我的项目结构

Project/
└── src
    ├── GUI
    │   ├── Control.java
    │   ├── Main.java
    │   └── pages
    │       ├── LoginPanel.java
    └── Helper
        └── Helpers.java

编辑

在尝试发布的答案后,我得到:

This is the picture

form 面板中的组件的行为与我预期的不同

还有我的代码:

登录面板

package GUI.pages;
import javax.swing.*;

public class LoginPanel extends JPanel 

    private static final int PADDING = 30;
    // Some labels, button, groups and fields
    private static JLabel usernameLabel;
    private static JTextField usernameInputField;
    private static JLabel passwordLabel;
    private static JPasswordField passwordInputField;
    private static JButton submit;
    private static JLabel title = Helpers.generateTitle();


    public LoginPanel() 

        setLayout(new BorderLayout());
        setSize(400, 400);

        JPanel titleContainer = new JPanel();
        titleContainer.setLayout(new FlowLayout(FlowLayout.LEFT, PADDING, PADDING));
        titleContainer.add(title);

        // the username row
        usernameLabel = new JLabel("Username: ");
        usernameInputField = new JTextField(50);

        // The password row
        passwordLabel = new JLabel("Password: ");
        passwordInputField = new JPasswordField(150);

        JPanel form = new JPanel();
        form.setLayout(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(0,20,0,0);
        form.add(usernameLabel, c);

        c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 1;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(0,20,0,0);
        form.add(passwordLabel, c);

        c = new GridBagConstraints();
        c.gridx = 1;
        c.gridy = 0;
        c.weightx = 0.1;
        c.ipadx = 200;

        form.add(usernameInputField, c);

        c = new GridBagConstraints();
        c.gridx = 1;
        c.gridy = 1;
        c.weightx = 0.001;
        c.weightx = 0.001;
        c.ipadx = 200;

        form.add(passwordInputField, c);

        // The message label, the text depends on the query's result.
        message = new JLabel();

        // Configuring the submit button
        submit = new JButton("Sign in");
        submit.addActionListener(new LoginActionListener());
        submit.setActionCommand("login");

        // Configuring the redirecting button
        registerRedirect.setActionCommand("registerRedirect");
        registerRedirect.addActionListener(new Router());


        JPanel submitContainer = new JPanel();
        submitContainer.setLayout(new FlowLayout(FlowLayout.RIGHT, PADDING, PADDING));
        submitContainer.add(submit);

        form.setMaximumSize(new Dimension(200, passwordInputField.getHeight()));

        // adding everything to the layout

        add(titleContainer, BorderLayout.PAGE_START);
        add(form);
        add(submitContainer, BorderLayout.PAGE_END);

    

主要

package GUI;

import javax.swing.*;
import GUI.pages.LoginPanel;

public class Main extends JFrame 

    public final static int WINDOW_WIDTH = 750;
    public final static int WINDOW_HEIGHT = 550;

    public static void main(String[] args)
        JFrame frame = new Main();
    

    public Main()
        JPanel login_panel = new LoginPanel();
        add(login_panel);
        setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    


这就是我想要的样子(更新):

REM(the title)        
________________________________
           __________________
Username: [__________________]
           __________________
Password: [__________________]
                      
                   [Submit button]
                    

【问题讨论】:

1) 为了尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。 2) 以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果可调整大小,则具有更大的宽度和高度 - 以显示应如何使用额外空间。 【参考方案1】:

我不清楚提交按钮是右对齐还是居中,但是..

蓝色区域:BorderLayout。 红色区域:GridBagLayout - 标签右对齐,文本字段左对齐。在边框布局的CENTER 中。 绿色区域:FlowLayoutPAGE_START 左对齐和 PAGE_END 居中对齐或右对齐(根据需要)。

【讨论】:

“按钮右对齐” 嗯嗯..那么,你排序了吗? 你看过API documentation for flow layout吗?文档应该是您首先查看的地方。流布局的构造函数将是一个很好的起点。 在minimal reproducible example 的表单中显示您对问题的尝试作为edit。听起来好像代码在添加组件时没有使用PAGE_STARTPAGE_END的约束。 “我已经更新了。”回去再读一遍MRE文档。还可以阅读Short, Self Contained, Correct Example 上的页面。更长的页面谈论同样的事情,但更详细。上面发布的内容既不是第一个的 R 也不是第二个的 SC。 如果在编辑中看到的代码被复制/粘贴到您的 IDE 中的新项目中,它是否可以干净地编译而没有更改(包括 IDE 自动添加导入语句)?它运行吗?代码需要导入和 main 方法才能将其显示在屏幕上。 MRE / SSCCE 的想法之一是使其易于测试。在这里提供免费帮助的人时间有限,解决问题只有“学术兴趣”。如果有很多人提出问题,我们会专注于那些让我们更容易提供帮助的人!

以上是关于Java Swing 登录表单的主要内容,如果未能解决你的问题,请参考以下文章

用Java 编用户登录表单

java swing怎么清空表单

Java Swing jComboBox 未从数据库中填充

无法使用 Swing 登录

在 Swing 应用程序中显示 HTML 表单并与之交互

Java 表单验证