用于软件的Java Swing GUI,最好的方法

时间:2012-11-20 19:27:50

标签: java swing user-interface awt

我需要为一个程序创建一个GUI,其中一个登录面板将在设置登录后显示真实的软件。

所以问题是:

我应该创建两个帧并显示第一个用于登录,第二个用于程序吗?或者最好添加两个不同的面板并在程序启动时隐藏登录?

4 个答案:

答案 0 :(得分:5)

这有点主观。对我来说,这可归结为应用程序的复杂程度以及是否需要支持多个会话以及这些会话是否共享一个帧。

如果您的应用程序相对简单(例如有一个或两个视图),我认为可以使用类似CardLayout之类的东西,只需在用户成功时在主应用程序框架中显示登录窗格经过身份验证,切换到主视图。

如果应用程序更复杂,我会考虑使用单独的对话框。

即使您允许用户拥有多个会话,也可以归结为实际应用程序(IMHO)的复杂程度,以及我是否会使用单独的对话框。

我还会考虑用户在登录前是否可以执行任何操作,例如,他们是否可以更新设置?如果是这样,使用面板将是合适的,因为登录对话框很可能是模态的。

答案 1 :(得分:4)

我个人首先为实际程序创建一个jFrame,然后(立即)打开一个jDialog窗口并在jFrame前面打开它。 jDialog类有一个方便的属性,当它打开时,你不能在你的另一帧上执行操作。因此必须首先关闭(在执行某些操作之后,如填写密码)。

答案 2 :(得分:2)

使用框架的GlassPane是一个选项(假设您不需要使用下拉列表)。有些人可能会说这是滥用窗格系统,但如果登录屏幕足够简单,我认为这是合法的。

好处是它已经存在供您使用(它不需要对您的应用程序进行重大更改),并且它会占用任何事件(因此它们不会传递给实际的应用程序)。它也很容易显示/隐藏。

垮台是一些摆动组件在玻璃窗格上不起作用(JComboBox就是一个例子)。

以下是使用GlassPane的示例:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class QuickTest {

    public QuickTest(){
        //Setup Frame
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
        frame.pack();
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);

        //Setup Main Content
        JPanel main = new JPanel();
        main.add(new JLabel("Here's the application!"));
        frame.setContentPane(main);

        //Setup login Screen
        Box login = new Box(BoxLayout.Y_AXIS){
            // Makes the main screen faded
            public void paintComponent(Graphics g){
                g.setColor(new Color(255,255,255,200));
                g.fillRect(0,0, getWidth(), getHeight());
                super.paintComponent(g);
            }
        };
        login.add(new JLabel("Username here:"));
        login.add(new JLabel("Password here:"));
        JButton loginButton = new JButton("login");
        loginButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.getGlassPane().setVisible(false);
            }
        });
        login.add(loginButton);
        login.add(Box.createVerticalGlue());
        frame.setGlassPane(login);
        frame.getGlassPane().setVisible(true);

        //Show Frame
        frame.setVisible(true);


    }

    public static void main(String[] args){
        new QuickTest();
    }
}

答案 3 :(得分:-4)

您执行登录页面并使用会话启用检查用户权限。如果识别出用户,则可以重定向到另一个页面。