JOptionPane to get password

后端 未结 6 994
耶瑟儿~
耶瑟儿~ 2020-12-01 13:52

JOptionPane can be used to get string inputs from user, but in my case, I want to display a password field in showInputDialog.

The way I ne

6条回答
  •  天涯浪人
    2020-12-01 14:00

    The following class is an extension of Adamski's great answer:

    package com.stackoverflow.swing;
    
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    
    /**
     * Class that creates a panel with a password field. Extension of Adamski's class
     *
     * @author adamski https://stackoverflow.com/users/127479/adamski
     * @author agi-hammerthief https://stackoverflow.com/users/2225787/agi-hammerthief
     * @see https://stackoverflow.com/a/8881370/2225787
     */
    public class PasswordPanel extends JPanel {
    
      private final JPasswordField JFieldPass;
      private JLabel JLblPass;
      private boolean gainedFocusBefore;
    
      /**
       * "Hook" method that causes the JPasswordField to request focus when method is
       * first  called.
       */
      public void gainedFocus () {
        if (!gainedFocusBefore) {
          gainedFocusBefore = true;
          JFieldPass.requestFocusInWindow();
        }
      }
    
      public PasswordPanel (int length) {
        super(new FlowLayout());
        gainedFocusBefore = false;
        JFieldPass = new JPasswordField(length);
        Dimension d = new Dimension();
        d.setSize(30, 22);
        JFieldPass.setMinimumSize(d);
        JFieldPass.setColumns(10);
        JLblPass = new JLabel("Password: ");
        add(JLblPass);
        add(JFieldPass);
      }
    
      public PasswordPanel() {
        super(new FlowLayout());
        gainedFocusBefore = false;
        JFieldPass = new JPasswordField();
        Dimension d = new Dimension();
        d.setSize(30, 22);
        JFieldPass.setMinimumSize(d);
        JFieldPass.setColumns(10);
        JLblPass = new JLabel("Password: ");
        add(JLblPass);
        add(JFieldPass);
      }
    
      public char[] getPassword() {
        return JFieldPass.getPassword();
      }
    
      public String getPasswordString() {
        StringBuilder passBuilder = new StringBuilder();
    
        char[] pwd = this.getPassword();
        if (pwd.length > 0) {
          for (char c : pwd) {
            passBuilder.append(c);
          }
        }
    
        return passBuilder.toString();
      }
    
      private static String displayDialog (
        Component parent, final PasswordPanel panel, String title
      ) {
        String password = null;
        /* For some reason, using `JOptionPane(panel, JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE)`
        does not give the same results as setting values after creation, which is weird */
        JOptionPane op = new JOptionPane(panel);
        op.setMessageType(JOptionPane.QUESTION_MESSAGE);
        op.setOptionType(JOptionPane.OK_CANCEL_OPTION);
        JDialog dlg = op.createDialog(parent, title);
        // Ensure the JPasswordField is able to request focus when the dialog is first shown.
        dlg.addWindowFocusListener (new WindowAdapter () {
          @Override
          public void windowGainedFocus (WindowEvent e) {
            panel.gainedFocus ();
          }
        });
        dlg.setDefaultCloseOperation (JOptionPane.OK_OPTION); // necessary?
    
        dlg.setVisible (true);
    
        Object val = op.getValue ();
        if (null != val && val.equals (JOptionPane.OK_OPTION)) {
          password = panel.getPasswordString();
        }
    
        return password;
      }
    
      public static String showDialog (Component parent, String title) {
        final PasswordPanel pPnl = new PasswordPanel();
        return displayDialog(parent, pPnl, title);
      }
    
      public static String showDialog (
        Component parent, String title, int passwordLength
      ) {
        final PasswordPanel pPnl = new PasswordPanel(passwordLength);
    
        return displayDialog (parent, pPnl, title);
      }
    
      public static String showDialog (String title) {
        return showDialog(null, title);
      }
    
      public static String showDialog (String title, int passwordLength) {
        return showDialog(null, title, passwordLength);
      }
    
      /**
       * Show a test dialog
       */
      public static void main(String[] args) {
        String test = PasswordPanel.showDialog ("Enter Your Password");
        System.out.println ("Entered Password: " + test);
        System.exit(0);
      }
    
    }
    

提交回复
热议问题