import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* PasswordChanger is a simple dialog that allows users to enter their old password
* and to reequest a new one. An abstract callback method is used to validate or reject
* user entries.
* Copyright: Copyright (c) 2004
* Company: Superliminal Software
*
* @author Melinda Green
* Date: Aug 2, 2004
*/
public abstract class PasswordChanger extends JDialog {
/**
* Creates and displays a PasswordChanger object.
* NOTE: Callers should not call setVisible() on these objects
* and should throw away any instances once their acceptPasswordChange callback returns 'true'.
* @param owner same as JDialog constuctor
* @param uname user name used in title
*/
public PasswordChanger(JFrame owner, String uname) {
super(owner, "Changing Password For " + uname, true);
JPanel typeins = new JPanel(new GridLayout(3, 2));
final JPasswordField
old = new JPasswordField(14),
try1 = new JPasswordField(14),
try2 = new JPasswordField(14);
typeins.add(new JLabel("Old Password: "));
typeins.add(old);
typeins.add(new JLabel("New Password: "));
typeins.add(try1);
typeins.add(new JLabel("Retype Password: "));
typeins.add(try2);
final JButton changeit = new JButton("Change Password");
changeit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(acceptPasswordChange(new String(old.getPassword()), new String(try1.getPassword()))) {
JOptionPane.showMessageDialog(PasswordChanger.this, "Password Changed");
setVisible(false);
}
else
JOptionPane.showMessageDialog(PasswordChanger.this, "Invalid Password");
}
});
// allow for <enter> key in text fields to click button when enabled
KeyListener quickchange = new KeyAdapter() {
public void keyTyped(KeyEvent ke) {
if(ke.getKeyChar() == KeyEvent.VK_ENTER && changeit.isEnabled()) {
changeit.doClick();
changeit.requestFocus();
}
}
};
old.addKeyListener(quickchange);
try1.addKeyListener(quickchange);
try2.addKeyListener(quickchange);
// enforce that the 'changeit' button is only enabled when valid data is ready.
new ComponentDependencyHandler(old, try1, try2) {
public void dependencyNotification() {
String
op = new String(old.getPassword()),
t1 = new String(try1.getPassword()),
t2 = new String(try2.getPassword());
changeit.setEnabled(t1.equalsIgnoreCase(t2) && !t1.equalsIgnoreCase(op));
}
};
// create the final layout and show the dialog
Container content = getContentPane();
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
content.add(typeins);
content.add(changeit);
pack();
if(owner != null)
setLocation(owner.getX()+50, owner.getY()+50);
setVisible(true);
} // end PasswordChanger()
/**
* Implement this method to approve or reject a new password.
* @param oldpswd what the user declares to be their current password.
* @param newpswd user's equested new password.
* @return true if old password entered matches current system value, and new password is acceptible.
*/
protected abstract boolean acceptPasswordChange(String oldpswd, String newpswd);
/**
* a simple example main method that presents a PasswordChanger that accepts a new password of "pass"
*/
public static void main(String[] args) {
new PasswordChanger(null, "Joe") {
protected boolean acceptPasswordChange(String oldpswd, String newpswd) {
return "pass".equalsIgnoreCase(newpswd);
}
};
}
}