import javax.swing.*; import java.awt.*; import java.awt.event.*; /* PasswordDemo.java requires no other files. */ public class PasswordDemo extends JPanel implements ActionListener { private static String OK = "ok"; private static String HELP = "help"; private JFrame controllingFrame; //needed for dialogs private JPasswordField passwordField; public PasswordDemo(JFrame f) { //Use the default FlowLayout. controllingFrame = f; //Create everything. passwordField = new JPasswordField(10); passwordField.setActionCommand(OK); passwordField.addActionListener(this); JLabel label = new JLabel("Enter the password: "); label.setLabelFor(passwordField); JComponent buttonPane = createButtonPanel(); //Lay out everything. JPanel textPane = new JPanel(new FlowLayout(FlowLayout.TRAILING)); textPane.add(label); textPane.add(passwordField); add(textPane); add(buttonPane); } protected JComponent createButtonPanel() { JPanel p = new JPanel(new GridLayout(0,1)); JButton okButton = new JButton("OK"); JButton helpButton = new JButton("Help"); okButton.setActionCommand(OK); helpButton.setActionCommand(HELP); okButton.addActionListener(this); helpButton.addActionListener(this); p.add(okButton); p.add(helpButton); return p; } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (OK.equals(cmd)) { //Process the password. char[] input = passwordField.getPassword(); if (isPasswordCorrect(input)) { JOptionPane.showMessageDialog(controllingFrame, "Success! You typed the right password."); } else { JOptionPane.showMessageDialog(controllingFrame, "Invalid password. Try again.", "Error Message", JOptionPane.ERROR_MESSAGE); } //Zero out the possible password, for security. for (int i = 0; i < input.length; i++) { input[i] = 0; } passwordField.selectAll(); resetFocus(); } else { //The user has asked for help. JOptionPane.showMessageDialog(controllingFrame, "You can get the password by searching this example's\n" + "source code for the string \"correctPassword\".\n" + "Or look at the section How to Use Password Fields in\n" + "the components section of The Java Tutorial."); } } /** * Checks the passed-in array against the correct password. * After this method returns, you should invoke eraseArray * on the passed-in array. */ private static boolean isPasswordCorrect(char[] input) { boolean isCorrect = true; char[] correctPassword = { 'b', 'u', 'g', 'a', 'b', 'o', 'o' }; if (input.length != correctPassword.length) { isCorrect = false; } else { for (int i = 0; i < input.length; i++) { if (input[i] != correctPassword[i]) { isCorrect = false; } } } //Zero out the password. for (int i = 0; i < correctPassword.length; i++) { correctPassword[i] = 0; } return isCorrect; } //Must be called from the event-dispatching thread. protected void resetFocus() { passwordField.requestFocusInWindow(); } /** * Create the GUI and show it. For thread safety, * this method should be invoked from the * event-dispatching thread. */ private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("PasswordDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. final PasswordDemo newContentPane = new PasswordDemo(frame); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Make sure the focus goes to the right component //whenever the frame is initially given the focus. frame.addWindowListener(new WindowAdapter() { public void windowActivated(WindowEvent e) { newContentPane.resetFocus(); } }); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }