2015-10-16 2 views
0

Программа инициализирует пароль. Затем, если пользователь хочет изменить пароль, он нажмет кнопку смены пароля. Затем программа откроет новое окно, после чего пользователь должен будет ввести текущий пароль, новый пароль и подтвердить пароль, а затем при повторном входе в систему пароль изменится. Проблема моей программы в том, что она не изменяет пароль и всегда является инициализированным паролем. Как это исправить? Вот мой код:Сменить пароль с помощью JPasswordField

//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)" + "(?=.*?[`[email protected]#$%^&*()\\-_=+\\\\\\|\\[{\\]};:'\",<.>/?]).*$"; 
           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); 
     } 
    } 
} 
+0

Не полагайтесь на 'static', используйте модальный диалог, чтобы представить запрос на изменение пароля, когда диалог закрытый, получите значения, и вы сравниваете их – MadProgrammer

+0

Наш профессор не обсудил, что такое модальный диалог, поэтому я не знаю, как его программировать. – Mariel

+0

[Как сделать диалоги] (http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html) – MadProgrammer

ответ

1

Основная проблема, вы создаете новый экземпляр FinalLoginForm в вашем FinalChangePassword, который не имеет контекста или отношения к исходной форме входа или новый пароль.

Основным ответом является использование модального диалога для запроса информации от пользователя, а затем принятия решений на основе выбора, который пользователь делает.

Сфокусируйтесь на том, какова ответственность каждой области вашего кода, например, представление «сменить пароль», вероятно, фактически не отвечает за проверку старого значения пароля с текущим значением пароля, которое должно соответствовать представлению который фактически имеет текущий пароль (или какой-либо другой валидатор). В представлении «сменить пароль» следует сосредоточиться на получении необходимой информации от пользователя.

Например ...

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 s, один для старого и один для нового пароля.

Теперь нам нужно каким-то образом на самом деле показать панель и получить значения от него ...

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], проверяет их

Смежные вопросы