2015-10-16 55 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); 
    } 
} 

空白空間

//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

的主要問題是,你是在爲你FinalChangePassword其中沒有上下文或關係到原來的登錄表單或創建的FinalLoginForm一個新實例新密碼。

基本的答案是使用模態對話框向用戶請求信息,然後根據用戶的選擇做出決定。

專注於代碼的每個區域的責任是什麼,例如,「更改密碼」視圖可能實際上不負責使用當前密碼值驗證舊密碼值,這應該由視圖決定其中實際上有當前的密碼(或其他驗證器)。 「更改密碼」視圖應着重於從用戶那裏獲取所需的信息。

例如...

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,一個用於舊密碼,另一個用於新密碼。

現在,我們需要一些方法來實際顯示面板,並從中獲取值...

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。這會提示用戶輸入舊密碼和新密碼,當用戶按[確定]時,驗證它們。