Change password using JPasswordField

自闭症网瘾萝莉.ら 提交于 2020-01-07 05:21:07

问题


The program will initialized a password.Then if the user wants to change the password, they'll click the change password button. Then, the program will open a new window then the user will have to input the current password, new password, and confirm password then if you login again, the password will change. My program's problem is that it does not change its password and is always the initialized password. How do i fix this? Here's my code:

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

Blank Space

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

回答1:


The primary problem is you're creating a new instance of FinalLoginForm in your FinalChangePassword which has no context or relationship to the original login form or the new password.

The basic answer is to use a modal dialog to request information from the user and then make decisions based on the choices that the user makes.

Focus on what the responsibility of each area of your code is, for example, the "change password" view is probably not actually responsible for validating the old password value with the current password value, that should be up to the view which actually has the current password (or some other validator). The "change password" view should focus on getting the required information from the user.

For example...

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

Pretty basic. All it is is a JPanel with two JPasswordFields, one for the old and one for the new password.

Now, we need some way to actually show the panel and get the values from it...

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

}

Now, this simply uses a JOptionPane to show the ChangePasswordPane, but you could also create your own JDialog if you wanted. This prompts the user for the old and new passwords and when the user presses [Okay], validates them



来源:https://stackoverflow.com/questions/33163252/change-password-using-jpasswordfield

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!