Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
220 views
in Technique[技术] by (71.8m points)

java - Change password using JPasswordField

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);
        }
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...