Java Swing GUI为一个软件,最好的方法



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

所以问题是:

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

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

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

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

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

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

就我个人而言,我会先为实际程序创建一个jFrame,然后(立即)打开一个jDialog窗口并在jFrame前面打开它。jDialog 类有一个方便的属性,当它打开时,您无法对其他帧执行操作。因此,必须首先关闭它(在某些操作之后,例如填写密码)。

使用框架的 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();
    }
}

您创建一个登录页面,并在启用会话的情况下检查用户权限。如果用户被识别,那么您可以重定向到另一个页面。

相关内容

最新更新