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("MyApp Login");
        //this.getMainFrame().setSize(600, 350);            // Setta le dimensioni del JFrame che rappresenta la finestra principale
        this.getMainFrame().pack();
        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(5, 1));

        JPanel usernNameLabelPabel = new JPanel();
        usernNameLabelPabel.add(new JLabel("Username"));
        body.add(usernNameLabelPabel);


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


        JPanel passwordLabelPanel = new JPanel();
        passwordLabelPanel.add(new JLabel("Password"));
        body.add(passwordLabelPanel);


        JPanel passwordTextPanel = new JPanel();
        JTextField password = new JTextField();
        passwordTextPanel.add(password);
        body.add(passwordTextPanel);


        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. JLabel 和 JTextField 相互垂直压缩
  2. 在上一个示例中,元素居中且未与左侧对齐
  3. JTextField 很短

我可以尝试什么来解决这些问题?

4

1 回答 1

3
    JPanel passwordLabelPanel = new JPanel();
    passwordLabelPanel.add(new JLabel("Password"));
    body.add(passwordLabelPanel);

你在几个地方做了类似的代码,将一个组件(JLabel/JTextFeild)放在另一个容器中,然后将它添加到根容器中body。任何 PanelFlowLayout的默认布局都遵循您要添加到其中的组件的首选大小。您正在添加您的password labelpasswordLabelPanel但没有设置它的首选大小。你遇到的同样的问题TextField和它的容器passwordTextPanel。您可以为此设置首选大小,labeltextFeild获得一些可能让您满意的输出。但事实是,您根本不需要这个外部面板。只需将标签和文本字段直接添加到body面板。

我可以尝试什么来解决这些问题?

上面的解释也是一种解决方法。但从长远来看,除非您学习布局管理器,否则它们对您没有任何意义。

最好、最简单、最有效的方法,值得付出一些努力,是从这里开始:课程:在容器中布置组件,相信我,它会为您(包括我们)节省大量时间。

于 2013-11-07T18:07:41.403 回答