首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JPasswordField更改密码

使用JPasswordField更改密码
EN

Stack Overflow用户
提问于 2015-10-16 05:39:15
回答 1查看 3.1K关注 0票数 0

如果用户想更改密码,程序将初始化一个password.Then,他们将单击“更改密码”按钮。然后,程序将打开一个新的窗口,然后用户将不得不输入当前的密码,新的密码,并确认密码,然后如果你再次登录,密码将改变。我的程序的问题是它不更改密码,并且始终是初始化的密码。我该怎么解决这个问题?这是我的密码:

代码语言:javascript
复制
//FinalLoginForm class
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.event.ActionListener;
public class FinalLoginForm extends JFrame implements ActionListener{
    JLabel unLabel;
    JLabel pwLabel;
    JTextField unTextField;
    JPasswordField pwPasswordField;
    final JButton okButton = new JButton("OK");
    final JButton newPwButton = new JButton("Change Password");
    static FinalLoginForm myLogin = new FinalLoginForm();
    static FinalChangePassword change = new FinalChangePassword();
    String password = "Mariel97!";

    public FinalLoginForm(){
        super("Login Window");
        setLayout(null);
        unLabel = new JLabel("Username: ");
        pwLabel = new JLabel("Password: ");
        unTextField = new JTextField("");
        pwPasswordField = new JPasswordField("");
        okButton.setName("OK");
        newPwButton.setName("Change Password");

        unLabel.setBounds(40,60,100,30);     unTextField.setBounds(120,60,100,30);
        pwLabel.setBounds(40,90,100,30);     pwPasswordField.setBounds(120,90,100,30);
        okButton.setBounds(20,120,100,30);   newPwButton.setBounds(120,120,150,30);

        add(unLabel);
        add(pwLabel);
        add(unTextField);
        add(pwPasswordField);
        add(okButton);       
        add(newPwButton);  

        okButton.addActionListener(this);
        newPwButton.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e){
        if(okButton.getName().equals(((Component)e.getSource()).getName())){
            if(unTextField.getText().equals("mvbasbas")&& (new String(pwPasswordField.getPassword())).equals(password)){
                JOptionPane.showMessageDialog(this, "Welcome "+unTextField.getText()+"!", "Welcome!", JOptionPane.INFORMATION_MESSAGE);
            }
            else 
                JOptionPane.showMessageDialog(this, "Invalid username or password!", "Error!", JOptionPane.ERROR_MESSAGE);
        }
        else if(newPwButton.getName().equals(((Component)e.getSource()).getName())){
                FinalChangePassword changes = new FinalChangePassword();
                changes.setVisible(true);
                changes.setSize(300, 300);
                changes.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                changes.setResizable(false);
                myLogin.setVisible(false);JOptionPane.showMessageDialog(this, "Welcome "+msg+"!", "Login Form", JOptionPane.WARNING_MESSAGE);
            }
    }

    public static void main(String args[]){        
        myLogin.setVisible(true);
        myLogin.setResizable(false);
        myLogin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myLogin.setSize(300,300);
    }
}

空白

代码语言:javascript
复制
//FinalChangePassword
import java.util.regex.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.event.ActionListener;
public class FinalChangePassword extends JFrame implements ActionListener{
    JLabel currentPwLabel;
    JLabel newPwLabel;
    JLabel confirmPwLabel;
    JPasswordField currentPasswordField;
    JPasswordField newPasswordField;
    JPasswordField confirmPasswordField;
    JButton okButton;
    JButton cancelButton;
    static FinalLoginForm myLogin = new FinalLoginForm();
    static FinalChangePassword change = new FinalChangePassword();
    String currentPassword;
    String newPassword;
    String confirmPassword;

    public FinalChangePassword(){
        super("Change Password");
        setLayout(null);
        currentPwLabel = new JLabel("Current Password: ");
        newPwLabel = new JLabel("New Password: ");
        confirmPwLabel = new JLabel("Confirm Password: ");
        currentPasswordField = new JPasswordField("");
        newPasswordField = new JPasswordField("");
        confirmPasswordField = new JPasswordField("");
        okButton = new JButton("OK");
        cancelButton = new JButton("Cancel");

        currentPwLabel.setBounds(30,60,200,35);    currentPasswordField.setBounds(145,60,100,30);
        newPwLabel.setBounds(30,90,100,35);        newPasswordField.setBounds(145,90,100,30);
        confirmPwLabel.setBounds(30,120,200,35);   confirmPasswordField.setBounds(145,120,100,30);
        okButton.setBounds(45,150,100,30);         cancelButton.setBounds(145,150,100,30);

        add(currentPwLabel);
        add(newPwLabel);
        add(confirmPwLabel);
        add(currentPasswordField);
        add(newPasswordField);
        add(confirmPasswordField);
        add(okButton);       
        add(cancelButton);  

        okButton.addActionListener(this);
        cancelButton.addActionListener(this);
    }

     public static void main(String args[])throws NullPointerException{
        change.setVisible(true);
        change.setSize(300, 300);
        change.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        change.setResizable(false);
    }

     public void actionPerformed(ActionEvent e){
        if(e.getSource()==okButton){
                int response = JOptionPane.showConfirmDialog(this, "Do you want to change your password?", "Changing",JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
                if(response == JOptionPane.YES_OPTION){
                    char[] curPw = currentPasswordField.getPassword();
                    currentPassword = new String(curPw);
                    char[] newPw = newPasswordField.getPassword();
                    newPassword = new String(newPw);
                    char[] conPw = confirmPasswordField.getPassword();
                    confirmPassword = new String(conPw);
                    if(myLogin.password.equals(currentPassword)){
                        if(newPassword.length()>7){
                            if(newPassword.equals(myLogin.password))
                                JOptionPane.showMessageDialog(this, "Password already exists!", "Error!", JOptionPane.ERROR_MESSAGE);
                            else{
                                String regex = "^(?=.*?\\p{Lu})(?=.*?[\\p{L}&&[^\\p{Lu}]])(?=.*?\\d)" + "(?=.*?[`~!@#$%^&*()\\-_=+\\\\\\|\\[{\\]};:'\",<.>/?]).*$";
                                Pattern p = Pattern.compile(regex);
                                Matcher m = p.matcher(newPassword);
                                if(m.matches()){
                                    if(newPassword.equals(confirmPassword)){
                                        myLogin.password = newPassword;
                                        FinalLoginForm myLogins = new FinalLoginForm();
                                        myLogins.setVisible(true);
                                        myLogins.setResizable(false);
                                        myLogins.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                        myLogins.setSize(300,300);
                                        change.setVisible(false);
                                    }
                                    else{
                                        JOptionPane.showMessageDialog(this, "Password does not match!", "Error!", JOptionPane.ERROR_MESSAGE);
                                    }
                                }
                                else{
                                    JOptionPane.showMessageDialog(this, "Must have Capital Letter, Small Letter, Number and Special Character!", "Error!", JOptionPane.ERROR_MESSAGE);
                                }
                            }

                        }
                        else
                            JOptionPane.showMessageDialog(this, "Must have at least 8 characters!", "Error!", JOptionPane.ERROR_MESSAGE);
                    }
                    else
                            JOptionPane.showMessageDialog(this, "Wrong current password!", "Error!", JOptionPane.ERROR_MESSAGE);
                }
        }
        else
        {
            FinalLoginForm myLogins = new FinalLoginForm();
            myLogins.setVisible(true);
            myLogins.setResizable(false);
            myLogins.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            myLogins.setSize(300,300);
            change.setVisible(false);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-16 06:22:26

主要的问题是在您的FinalLoginForm中创建一个新的FinalChangePassword实例,它与原始登录表单或新密码没有上下文或关系。

基本的答案是使用一个模态对话框从用户那里请求信息,然后根据用户的选择做出决定。

关注代码中每个区域的责任,例如,“更改密码”视图可能实际上不负责使用当前密码值验证旧密码值,这应该取决于实际拥有当前密码的视图(或其他验证器)。“更改密码”视图应该集中于从用户那里获取所需的信息。

例如..。

代码语言:javascript
复制
public class ChangePasswordPane extends JPanel {
    private JPasswordField oldPassword;
    private JPasswordField newPassword;

    public ChangePasswordPane() {
        setLayout(new GridBagLayout());
        oldPassword = new JPasswordField(20);
        newPassword = new JPasswordField(20);

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.insets = new Insets(2, 2, 2, 2);
        gbc.gridx = 0;
        gbc.gridy = 0;
        add(new JLabel("Old password: "), gbc);
        gbc.gridy++;
        add(new JLabel("New password: "), gbc);

        gbc.gridx++;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridy = 0;
        add(oldPassword, gbc);
        gbc.gridy++;
        add(newPassword, gbc);
    }

    public char[] getOldPassword() {
        return oldPassword.getPassword();
    }

    public char[] getNewPassword() {
        return newPassword.getPassword();
    }
}

很基本的。它只是一个JPanel,它有两个JPasswordField,一个是旧的,另一个是新的密码。

现在,我们需要一些方法来显示面板,并从中得到值.

代码语言:javascript
复制
public class TestPane extends JPanel {

    // This is cheat for demonstration purposes, please don't do this
    // in production
    private char[] password = "banana".toCharArray();

    public TestPane() {
        setLayout(new GridBagLayout());
        JButton btn = new JButton("Change password");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ChangePasswordPane pane = new ChangePasswordPane();
                switch (JOptionPane.showConfirmDialog(TestPane.this, pane, "Change Password", JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION)) {
                    case JOptionPane.OK_OPTION:
                        char[] oldPassword = pane.getOldPassword();
                        if (Arrays.equals(password, oldPassword)) {
                            password = pane.getNewPassword();
                            JOptionPane.showMessageDialog(TestPane.this, "Password was changed");
                        } else {
                            JOptionPane.showMessageDialog(TestPane.this, "Password mismatch, your old password does not match your current password");
                        }
                        break;
                }
            }
        });

        add(btn);
    }

}

现在,这只是使用一个JOptionPane来显示ChangePasswordPane,但是如果需要的话,您也可以创建自己的JDialog。这将提示用户输入旧的和新的密码,当用户按下Okay时,验证它们

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33163252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档