Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解JXLoginPane示例周围的框架时遇到的问题_Java_Swing_Swingx_Jxloginpane - Fatal编程技术网

Java 理解JXLoginPane示例周围的框架时遇到的问题

Java 理解JXLoginPane示例周围的框架时遇到的问题,java,swing,swingx,jxloginpane,Java,Swing,Swingx,Jxloginpane,我在WindowBuilder中找到了一个名为JXLoginPane的组件,这似乎是我尝试做什么的一个很好的起点,但我需要更多关于如何使用它的信息。到目前为止,我发现唯一能真正帮助我的是 这确实让我了解了其中的大部分内容,但有几处引用了作者未提供的内容,如is.is_Statics、is.MD5Hash、以及isquote.Main。我猜这些是他或她为登录创建的类,但我不知道如何为自己创建它们 我怎样才能充实Ruxton在他的博客上开始的内容?或者,就这一点而言,有人能推荐一个比JXLoginP

我在WindowBuilder中找到了一个名为
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
,以及它是如何工作的。然后您将能够理解:

  • :创建带有控件的面板,以验证基于登录的应用程序中的用户

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

  • :抽象类,用于将用户键入的密码安全存储在某种缓存中,以帮助
    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();
            }
        });
    }
}