我需要为带有登录面板的程序创建一个 GUI,该面板将在设置登录后显示真实软件。
所以问题是:
我应该创建两个框架并显示第一个用于登录,第二个用于程序吗?还是在程序启动时添加两个不同的面板并隐藏登录更好?
我需要为带有登录面板的程序创建一个 GUI,该面板将在设置登录后显示真实软件。
所以问题是:
我应该创建两个框架并显示第一个用于登录,第二个用于程序吗?还是在程序启动时添加两个不同的面板并隐藏登录更好?
这有点主观。对我来说,这将归结为应用程序的复杂程度以及您是否需要支持多个会话以及这些会话是否共享一个框架。
如果您的应用程序相对简单(例如有一个或两个视图),我认为它可以使用类似 a 的东西,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();
}
}
您创建一个登录页面并使用会话启用检查用户权限。如果用户被识别,那么您可以重定向到另一个页面。