java - 使用 JPasswordField 更改密码

标签 java swing user-interface authentication change-password

程序将初始化一个密码。然后,如果用户想要更改密码,他们将单击更改密码按钮。然后,程序将打开一个新窗口,用户必须输入当前密码、新密码和确认密码,然后如果您再次登录,密码将更改。 我的程序的问题是它不更改其密码并且始终是初始化的密码。我该如何解决?这是我的代码:

//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);
    }
}

空白

//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);
        }
    }
}

最佳答案

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

基本答案是使用模式对话框向用户请求信息,然后根据用户所做的选择做出决策。

重点关注代码中每个区域的职责是什么,例如,“更改密码” View 可能实际上并不负责用当前密码值验证旧密码值,这应该取决于哪个 View 实际上有当前密码(或其他 validator )。 “更改密码” View 应侧重于从用户处获取所需的信息。

例如...

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();
    }
}

非常基本。它只是一个带有两个 JPasswordFieldJPanel,一个用于旧密码,一个用于新密码。

现在,我们需要某种方法来实际显示面板并从中获取值...

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。这会提示用户输入旧密码和新密码,当用户按[确定]时,将验证它们

关于java - 使用 JPasswordField 更改密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33163252/

相关文章:

java - 无法正确计算Java中的二维数组

java - 在调整应用程序窗口大小之前,jPanel 不会刷新

java - 在按钮的相对位置添加 JLabel

java - 如何将自定义 JTable 代码添加到 GUI Builder Netbeans?

python - 如何使用 tkinter.simpledialog 调用 "command"?

java - JTextField 和 RMI Java 的 GUI 问题

java - 运行我的聊天程序时出现地址已在使用错误

java - 使用 JSTL 导入另一个 Web 资源的内容

java - 调用了 paintComponent,但没有显示任何内容

java - 在 Eclipse 中解析来自 GUI 而不是控制台的输入