Java 为什么此Swing登录表单显示错误?

Java 为什么此Swing登录表单显示错误?,java,swing,user-interface,Java,Swing,User Interface,我对JavaSwing相当陌生,我有一个问题 我必须创建一个登录窗口,其灵感来自于这样的IMAGE(类似于此,scilicet windows必须显示两个文本字段,用户在其中插入用户名和密码,以及一个执行登录操作的按钮): 好的,我认为这很简单,我已经意识到下面的类可以做到这一点: package com.techub.crystalice.gui.login; import java.awt.BorderLayout; import java.awt.Container; import j

我对JavaSwing相当陌生,我有一个问题

我必须创建一个登录窗口,其灵感来自于这样的IMAGE(类似于此,scilicet windows必须显示两个文本字段,用户在其中插入用户名和密码,以及一个执行登录操作的按钮):

好的,我认为这很简单,我已经意识到下面的类可以做到这一点:

package com.techub.crystalice.gui.login;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.jdesktop.application.SingleFrameApplication;

import com.techub.crystalice.gui.Constants;
import com.techub.crystalice.gui.GUI;

public class LoginFrame extends SingleFrameApplication {
    @Override
    protected void startup() {
        // TODO Auto-generated method stub
        System.out.println("DENTRO: LoginFrame() ---> startup()");


        this.getMainFrame().setTitle("MyApplication Login");
        this.getMainFrame().setSize(600, 350);          // Setta le dimensioni del JFrame che rappresenta la finestra principale
        Container mainContainer = this.getMainFrame().getContentPane();     // Recupera l'oggetto Container del JFrame

        // Imposta un layput manager di tipo GridLayout per il contenitore principale: 3 righe ed una singola colonna:
        mainContainer.setLayout(new GridLayout(3,1));   

        // Contenitore rappresentato da 6 righe a singola colonna contenente i campi testuali e di input del login: 
        JPanel body = new JPanel();
        body.setLayout(new GridLayout(6, 1));
        body.add(new JLabel("Username"));

        JTextField userName = new JTextField();
        body.add(userName);

        body.add(new JLabel("Password"));
        JTextField password = new JTextField();
        body.add(password);

        this.getMainFrame().add(body);      // Aggiunge al JFrame principale il JPanel contenente il form di login


        show(this.getMainFrame());

        JPanel footer = new JPanel();
        footer.setLayout(new FlowLayout(FlowLayout.CENTER)); 

        JButton loginButton = new JButton("Login");
        footer.add(loginButton);

        this.getMainFrame().add(footer);    // Aggiunge al JFrame principale il JPanel contenente il bottone di login

    }

    public static void main(String[] args) {
        System.out.println("DENTRO: LoginFrame() ---> main()");
        launch(LoginFrame.class, args);
    }

}
此类使用名为JDesktop的litle框架,该框架涉及startup()方法的定义,但这是纯Swing代码。唯一要说的是,我通过以下代码行获得了主**JFrame**:

this.getMainFrame()
此示例似乎可行,但我在登录表单可视化中遇到了一些美学问题,因为我得到了以下结果:

如您所见,这是非常令人讨厌的,而且如果结构与示例相同,则会出现以下问题:

  • JTextField的高度太小
  • 我的元素之间没有上、左、右边距
  • 字体太小了
  • 我能以某种方式更正此错误吗?你能帮我提些建议吗?我的窗口的结构可以吗

    Tnx

    安德烈

  • this.getMainFrame().pack()
    应用于将
    JFrame
    的大小设置为显示所有组件所需的最小大小

  • 我建议
    GridBagLayout
    ,因为
    GridBagConstraints
    允许您指定
    Insets
    ,这是组件之间的间距,也允许您正确定位组件

  • 使用
    java.awt.Font
    对象设置适当大小的所需字体。保留对两个
    JLabel
    s的引用,然后使用
    setFont()
    设置正确的字体


  • GridLayout组件不符合宿主组件的首选大小(这是您想要的)。本例中的诀窍是添加一个JPanel(尊重首选大小),其中包含一个JTextField,这样基本上就可以满足您当前的需求

    JLabel
    JTextField
    JLabel
    JTextField

    之后

    JPanel(带JLabel)
    JPanel(带JTextField)
    JPanel(带JLabel)

    JPanel(使用JTextField)

    使用GridBagLayout而不是GridLayout(6,1)。该代码
    新的GridLayout(6,1)
    将给您带来美学问题。我觉得很奇怪……我遵循本教程,在这里使用GridLayout没有问题: