Java 理解JXLoginPane示例周围的框架时遇到的问题
我在WindowBuilder中找到了一个名为Java 理解JXLoginPane示例周围的框架时遇到的问题,java,swing,swingx,jxloginpane,Java,Swing,Swingx,Jxloginpane,我在WindowBuilder中找到了一个名为JXLoginPane的组件,这似乎是我尝试做什么的一个很好的起点,但我需要更多关于如何使用它的信息。到目前为止,我发现唯一能真正帮助我的是 这确实让我了解了其中的大部分内容,但有几处引用了作者未提供的内容,如is.is_Statics、is.MD5Hash、以及isquote.Main。我猜这些是他或她为登录创建的类,但我不知道如何为自己创建它们 我怎样才能充实Ruxton在他的博客上开始的内容?或者,就这一点而言,有人能推荐一个比JXLoginP
JXLoginPane
的组件,这似乎是我尝试做什么的一个很好的起点,但我需要更多关于如何使用它的信息。到目前为止,我发现唯一能真正帮助我的是
这确实让我了解了其中的大部分内容,但有几处引用了作者未提供的内容,如is.is_Statics
、is.MD5Hash
、以及isquote.Main
。我猜这些是他或她为登录创建的类,但我不知道如何为自己创建它们
我怎样才能充实Ruxton在他的博客上开始的内容?或者,就这一点而言,有人能推荐一个比JXLoginPane更好的替代方案吗?因为你才刚刚开始,我个人不会使用JXLoginPane。编写自己的登录面板并不难,我认为我是学习编写gui和使用swing的好地方 我得假设你知道使用swing的基本知识。如果不是这样,你就必须从头开始,学习如何创建和使用基本的swing组件。我还推荐netbeans作为您的IDE,GUI构建器的启动非常不错 至于登录面板,最基本的是,您只需要两个JTextFields和一个JButton。其他一切基本上都是多余的 一个JTextField将允许用户输入用户名,另一个将获取密码。您将在JButton上放置一个操作侦听器,按下该按钮时,将查找某个位置以查看该用户名是否存在,如果存在,密码是否匹配,然后采取适当的操作--即解锁要使用的程序的其余部分,告诉用户密码错误,等等 也许这是一个简单的好例子?
这里有两种方法,您必须自己编写代码。doSearch()和doLogin(字符串全名)。如果你只是在学习,你可以做一些简单的事情,比如在一些用户名和密码中硬编码,或者从文本文件中读取,看看是否有匹配项,而不是设置并连接到数据库。doLogin可以像禁用所有JComponents一样简单,然后在成功登录时启用它们。所有答案都取决于您的需求,但最重要的是您了解什么是
JXLoginPane
,以及它是如何工作的。然后您将能够理解:
- :创建带有控件的面板,以验证基于登录的应用程序中的用户
- :必须执行登录逻辑并确定用户身份验证是否有效的抽象基类。它保留了一个内部列表,其中包含在整个登录过程中通知的
s对象:登录已启动、已取消、成功和失败LoginListener
- :抽象类,用于将用户键入的密码安全存储在某种缓存中,以帮助
对用户进行身份验证。用于存储密码的实际机制由实现决定LoginService
- :与密码存储相同,但用于用户名
- :此接口提供一个合同,用于“侦听”当前登录过程并据此采取行动。例如,如果同一用户的登录尝试失败5次,您可以阻止该用户(假设有人试图入侵该帐户),或者如果登录过程成功,则如果您有兴趣保留包含用户会话的日志表,则可以在数据库中创建新的会话项
现在快速浏览一下这篇文章,我认为它是一个基于数据库服务的实现,结合了
用户名存储的基于用户名的缓存:
- 类
是。ISLoginService
是LoginService
抽象基类实现
- 类
is.ISUserNameStore
是UserNameStore
抽象类实现
PasswordStore
抽象类没有实现
- 类
是。ISLoginListener
是一个LoginListener
接口实现
最后,关于is.is_Statics
,is.MD5Hash
,和isquote.Main
似乎是该特定项目的实用程序类,与JXLoginPane
的要点无关。您可能会有自己的类来帮助您完成登录过程
简单例子
请考虑这个简单的例子来说明上面所描述的概念。你会发现让它工作起来并不难
注意:没有用户名和密码存储实现。
注2:参见
事实上,在过去的几个月里,我一直在处理Swing,所以我对它不再陌生,尽管我还是个业余爱好者。顺便说一句,WindowBuilderforEclipse是NetBeans的一个很好的替代品,IMHO。毫无疑问,我可以编写自己的登录对话框,这非常简单,但这意味着密码不安全。虽然在我的程序中,安全性不是最重要的,但我仍然想了解更好的方法:加密、盐渍等等。是的,博客作者似乎使用了某种其他实用程序,它使用“is”作为它所创建的类的标识符<例如,code>is.is_Statics
,可能只是一组static
helper方法。我猜是.MD5Hash
类有加密/加密密码之类的东西。我很想了解更多。但我将更多地研究您提到的抽象类和接口,希望更好地了解整个过程。谢谢,不客气。一旦您正确理解了这个API,您将感谢SwingLabs t
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();
}
});
}
}