0

我是 Java Swing的新手,我有一个问题。

我必须创建一个登录窗口,从类似这样的图像中获取灵感(就像这样,scilicet 窗口必须显示 2 个文本字段,用户在其中插入其用户名和密码以及执行登录操作的按钮):

在此处输入图像描述

好的,我认为这很简单,我已经实现了以下类:

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的小框架,它涉及到startup()方法的定义,但这是纯 Swing 代码。唯一要说的是,我通过这段代码行获得了主 **JFrame **:

this.getMainFrame()

这个例子似乎有效,但我在登录表单可视化中遇到了一些美学问题,因为我得到了以下结果:

在此处输入图像描述

如您所见,这非常讨厌,并且如果结构与示例相同,则存在一些问题:

  1. JTextField的高度太小
  2. 我的元素之间没有上、左、右边距
  3. 字体太小

我可以以某种方式纠正这个错误吗?你能帮我提些建议吗?我的窗户结构好吗?

肿瘤坏死因子

安德烈亚

4

2 回答 2

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

  2. 我建议GridBagLayout因为GridBagConstraints允许您指定Insets组件之间的间距,还允许您正确定位组件。

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

于 2013-11-07T16:56:07.523 回答
0

GridLayout 组件不支持托管组件的首选大小(这是您想要的)。在这种情况下,诀窍是添加一个 JPanel(它尊重首选大小),里面有一个 JTextField,所以基本上现在你有

JLabel
JTextField
JLabel
JTextField

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

于 2013-11-07T17:01:26.747 回答