我在WindowBuilder中找到了一个可以JXLoginPane
从SwingX中调用的组件,看起来它似乎是我尝试做的一个很好的起点,但我需要更多关于如何使用它的信息.到目前为止,我发现的唯一真正帮助我解决这个问题的是这篇9年前的博客文章.
它得到了我最那里的方式,但也有类似的事情多次提到is.IS_Statics
,is.MD5Hash
和isquote.Main
该作者没有提供.我猜这些是他或她为登录创建的类,但我不知道如何为自己创建它们.
我如何充实Ruxton在他的博客上开始的内容?或者,就此而言,有人可以推荐更好的替代方案JXLoginPane
吗?
所有答案都取决于您的要求,但最重要的是您了解JXLoginPane
它的作用和方式.然后你将能够理解9岁的帖子:
JXLoginPane:创建一个带有控件的面板,以在基于登录的应用程序中对用户进行身份验证.
LoginService:必须执行登录逻辑并确定用户身份验证是否有效的抽象基类.它保留了在整个登录过程中LoginListener
在LoginEvents上通知的s对象的内部列表:登录启动,取消,成功和失败.
PasswordStore:用于安全存储用户在某种缓存中键入的密码的抽象类,以帮助 LoginService
验证用户.用于存储密码的实际机制由实现决定.
UserNameStore:与PasswordStore
用户名相同.
LoginListener:此接口提供了一个"监听"当前登录过程并因此而行动的合同.例如,如果同一用户的登录尝试失败5次,则可能会阻止该用户假设某人正在尝试破解该帐户,或者如果登录过程成功,那么如果您有兴趣保留一个新的会话条目,则可以在数据库中创建一个新的会话条目.用户会话的日志表.
现在快速浏览一下这篇文章,我认为这是一个基于数据库服务的实现与基于首选项的用户名缓存相结合UserNameStore
:
Class is.ISLoginService
是LoginService
抽象基类实现.
Class is.ISUserNameStore
是UserNameStore
抽象类实现.
PasswordStore
抽象类没有实现.
Class is.ISLoginListener
是一个LoginListener
接口实现.
最后,关于is.IS_Statics
,is.MD5Hash
并且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(); } }); } }