当前位置: 首页 > 知识库问答 >
问题:

JavaSwing'GridBagLayout'对齐问题

林承悦
2023-03-14

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

我的项目结构

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

表单面板中的组件没有像我预期的那样工作,我希望字段靠近标签,但不要水平填充整个空间。

我的代码是:

登录面板

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

public class LoginPanel extends JPanel {

    // Some labels, button, groups and fields
    private static JTextField usernameInputField;
    private static JPasswordField passwordInputField;
    private static JButton submit;
    private static JLabel message;
    private static JButton registerRedirect = new JButton("register");
    private static final int PADDING = 30;



    public LoginPanel() {

        setLayout(new BorderLayout());

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

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

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

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

        GridBagConstraints c = new GridBagConstraints();
        c.gridwidth = 2;
        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.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;
        JPanel usernameFieldContainer = new JPanel();
        usernameFieldContainer.add(usernameInputField);
        usernameFieldContainer.setSize(new Dimension(usernameInputField.getWidth() + 10, usernameInputField.getHeight() + 10));
        form.add(usernameFieldContainer, c);

        c = new GridBagConstraints();
        c.gridx = 1;
        c.gridy = 1;
        c.weightx = 0.001;
        c.weightx = 0.001;
        c.ipadx = 50;
        JPanel passwordFieldContainer = new JPanel();
        passwordFieldContainer.add(passwordInputField);
        passwordFieldContainer.setSize(new Dimension(passwordInputField.getWidth() + 10, passwordInputField.getHeight() + 10));
        form.add(passwordFieldContainer, c);

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

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


        // adding everything to the layout

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

主要的

package GUI;

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

public class Main extends JFrame {

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

    public Main(){
        JPanel login_panel = new LoginPanel();
        add(login_panel);
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        pack();
    }

}

这就是我希望它看起来的样子(更新):

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

共有1个答案

宋涵衍
2023-03-14

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

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

不要试图设置窗口大小。所有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。最后一行的按钮也是一样。

然后,您可以使用约束来控制行上标签/按钮的对齐方式。那就是你想要标签居中,按钮右对齐。

 类似资料:
  • 我使用创建面板。 我想要面板右角的删除图标。但是,如果未将添加到面板中,删除图标将向左移动。 如何正确地做到这一点? 这是我的GridBagLayout面板设置代码 有添加组件到面板的代码

  • 我正在处理一个纯CSS下拉框,但遇到了一些对齐问题。 特别是:当鼠标悬停在各自的菜单项上时,子菜单项会移到右侧。这是小提琴:https://jsfiddle.net/fhakjnhe/5/ HTML 相关CSS 我检查了类似的问题CSS下拉菜单: nav ul ul li移到右边,并检查了和设置为。同样在我的例子中,子项目在悬停时向右移动,在“隐藏”时似乎保持良好。

  • 我有一个带有JLabel、JTextField的JPanel,还有一个带有JLabel的JPanel。 最后一个JLabel结果在某个操作后打印成功消息。 然而,问题是当我得到成功响应时,成功消息而不是在底部出现在第一个JLabel的右侧。我对秋千很陌生。有谁能帮帮我吗?

  • 本文向大家介绍对齐相关面试题,主要包含被问及对齐时的应答技巧和注意事项,需要的朋友参考一下 语音有很多帧向量,向量与模型的每个状态之间建立对应关系 对齐关系 理解为观测序列Y GMM:给定状态下,特征的概率 DNN:给定输入下,知道属于哪个特征(多类判决问题)状态的概率分布。

  • align(resource $resourchHandle, Format::const ...$style): \Vtiful\Kernel\Format 示例 $format = new \Vtiful\Kernel\Format($fileHandle); $alignStyle = $format ->align(Format::FORMAT_ALIGN_CENTER,

  • 我在一个从上到下的boxLayout中有三个组件(JLabel、JTextField、JButton)。问题是,当我为标签设置X对齐方式时,它看起来好像我已经改变了按钮的X对齐方式,反之亦然,只有当两者的对齐方式相同时,它才能正常工作。 下面是我的代码: