理解围绕JXLoginPane示例的框架的问题

我已经在JXLoginPane找到了一个名为JXLoginPane的组件,可以在SwingX中找到它,这似乎是我尝试做的一个很好的起点,但我需要更多关于如何使用它的信息。 到目前为止,我发现的唯一真正帮助我解决这个问题的是这篇9年前的博客文章 。

它确实让我大部分都在那里,但有几个引用,如is.IS_Staticsis.MD5Hashisquote.Main ,作者没有提供。 我猜这些是他或她为登录创建的类,但我不知道如何为自己创建它们。

我怎样才能充实Ruxton在他的博客上开始的内容? 或者,就此而言,有人可以推荐一种更好的JXLoginPane替代方案吗?

所有答案都取决于您的要求,但最重要的是您了解JXLoginPane是什么以及它是如何工作的。 然后你将能够理解9岁的post :

  • JXLoginPane :创建一个带有控件的面板,以在基于登录的应用程序中对用户进行身份validation。

  • LoginService :必须执行登录逻辑并确定用户身份validation是否有效的抽象基类。 它保留LoginListener对象的内部列表,在整个登录过程中通知LoginEvents :登录启动,取消,成功和失败。

  • PasswordStore :抽象类,旨在安全地存储用户在某种缓存中键入的密码,以帮助LoginService对用户进行身份validation。 用于存储密码的实际机制由实现决定。

  • UserNameStore :与PasswordStore相同,但是对于用户名。

  • LoginListener :此接口提供了一个“监听”当前登录过程并因此而执行的合同。 例如,如果同一用户的登录尝试失败5次,您可以阻止该用户假设某人正在尝试破解该帐户,或者如果登录过程成功,那么您可以在数据库中创建新的会话条目,如果您有兴趣保留用户会话的日志表。


现在快速浏览一下这篇文章,我认为这是一个基于数据库服务的实现与UserNameStore基于首选项的用户名缓存相结合:

  • is.ISLoginServiceLoginService抽象基类实现。

  • is.ISUserNameStoreUserNameStore抽象类实现。

  • PasswordStore抽象类没有实现。

  • is.ISLoginListener是一个LoginListener接口实现。

最后,关于is.IS_Staticsis.MD5Hashisquote.Main似乎是该特定项目的实用程序类,与isquote.Main的基本要素JXLoginPane 。 您可能拥有自己的类来帮助您进行登录过程。


简单的例子

请考虑这个简单的例子来说明上述概念。 你会发现让它运作并不困难。

注意:没有用户名或密码存储实现。
注2:请参阅LoginAdapter

 import java.awt.event.WindowEvent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import org.jdesktop.swingx.JXLoginPane; import org.jdesktop.swingx.auth.LoginAdapter; import org.jdesktop.swingx.auth.LoginEvent; import org.jdesktop.swingx.auth.LoginListener; import org.jdesktop.swingx.auth.LoginService; public class Demo { private JFrame frame; private String userName; private int failedAttemptsCount = 0; private void showLoginDialog() { frame = new JFrame("Welcome!"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); final JXLoginPane loginPane = new JXLoginPane(); LoginListener loginListener = new LoginAdapter() { @Override public void loginFailed(LoginEvent source) { failedAttemptsCount++; String message; switch(failedAttemptsCount) { case 1: message = "Come on buddy! What happened?"; break; case 2: message = "Did you just fail again?"; break; case 3: message = "This is embarrassing..."; break; default: message = "You should probably go home and get some sleep..."; } loginPane.setErrorMessage(message); } @Override public void loginSucceeded(LoginEvent source) { Demo.this.userName = loginPane.getUserName(); Demo.this.createAndShowGui(); } }; LoginService loginService = new LoginService() { @Override public boolean authenticate(String name, char[] password, String server) throws Exception { return name.equals("Sturm") && String.valueOf(password).equals("StackOverflow") ; } }; loginService.addLoginListener(loginListener); loginPane.setLoginService(loginService); JXLoginPane.JXLoginDialog dialog = new JXLoginPane.JXLoginDialog(frame, loginPane); dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dialog.setVisible(true); // if loginPane was cancelled or closed then its status is CANCELLED // and still need to dispose main JFrame to exiting application if(loginPane.getStatus() == JXLoginPane.Status.CANCELLED) { frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING)); } } private void createAndShowGui() { String welcomeMessage = String.format("Welcome %s ! You have successfuly loged in.", userName); JPanel panel = new JPanel(); panel.add(new JLabel(welcomeMessage)); frame.add(panel); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Demo().showLoginDialog(); } }); } } 

由于你刚开始,我个人不会使用JXLoginPane。 编写自己的登录面板并不是很难,我认为我是学习编码gui和使用swing的好地方。

我将不得不假设您了解使用swing的基础知识。 如果没有,你真的必须从头开始,并完成如何创建和使用基本摆动组件的教程。 我还建议使用netbeans作为你的IDE,GUI构建器是相当不错的开始。

至于登录面板,它非常基础,你只需要两个JTextField和一个JButton。 其他一切基本上都是额外的。

一个JTextField将允许用户输入他们的用户名,另一个将使用他们的密码。 你将在JButton上放置一个动作监听器,当按下它时会查找某个地方以查看该用户名是否存在,如果存在,密码是否匹配,则采取相应的操作 – 即解锁其余的程序以便使用,告诉用户密码错误等等。

也许这是一个很好的简单例子? http://www.novell.com/documentation/developer/samplecode/bns_ldap_sample/LoginSample/Login.java.html

这里有两种方法,您必须自己编写代码。 doSearch()和doLogin(String fullName)。 如果您只是在学习,那么您可以做一些简单的事情,例如只是在某些用户名和密码中进行硬编码,或者从文本文件中读取以查看是否存在匹配而不是设置和连接到数据库。 doLogin可以像禁用所有JComponents一样简单,然后在成功登录时启用它们。