52 votes

JOptionPane pour obtenir le mot de passe

JOptionPane peut être utilisé pour obtenir des entrées de chaîne de l'utilisateur, mais dans mon cas, je veux afficher un champ de mot de passe dans showInputDialog .

La façon dont j'ai besoin est que l'entrée donnée par l'utilisateur soit masquée et que la valeur de retour soit en char[] . J'ai besoin d'une boîte de dialogue avec un message, un champ de mot de passe et deux boutons. Cela peut-il être fait? Merci.

73voto

Eng.Fouad Points 44085

Oui, il est possible d'utiliser JOptionPane.showOptionDialog() . Quelque chose comme ça:

 JPanel panel = new JPanel();
JLabel label = new JLabel("Enter a password:");
JPasswordField pass = new JPasswordField(10);
panel.add(label);
panel.add(pass);
String[] options = new String[]{"OK", "Cancel"};
int option = JOptionPane.showOptionDialog(null, panel, "The title",
                         JOptionPane.NO_OPTION, JOptionPane.PLAIN_MESSAGE,
                         null, options, options[1]);
if(option == 0) // pressing OK button
{
    char[] password = pass.getPassword();
    System.out.println("Your password is: " + new String(password));
}
 

44voto

Adamski Points 29884

La chose la plus facile est d'utiliser JOptionPanes' showConfirmDialog méthode et de passer une référence à un JPasswordField; par ex.

JPasswordField pf = new JPasswordField();
int okCxl = JOptionPane.showConfirmDialog(null, pf, "Enter Password", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

if (okCxl == JOptionPane.OK_OPTION) {
  String password = new String(pf.getPassword());
  System.err.println("You entered: " + password);
}

Modifier

Ci-dessous est un exemple de l'aide personnalisée JPanel pour afficher un message avec l' JPasswordField. Par le commentaire le plus récent, j'ai aussi (à la hâte) ajouté du code pour permettre à l' JPasswordField à obtenir le focus lorsque la boîte de dialogue est affichée pour la première fois.

public class PasswordPanel extends JPanel {
  private final JPasswordField passwordField = new JPasswordField(12);
  private boolean gainedFocusBefore;

  /**
   * "Hook" method that causes the JPasswordField to request focus the first time this method is called.
   */
  void gainedFocus() {
    if (!gainedFocusBefore) {
      gainedFocusBefore = true;
      passwordField.requestFocusInWindow();
    }
  }

  public PasswordPanel() {
    super(new FlowLayout());

    add(new JLabel("Password: "));
    add(passwordField);
  }

  public char[] getPassword() {
      return passwordField.getPassword();
  }

  public static void main(String[] args) {
      PasswordPanel pPnl = new PasswordPanel();
      JOptionPane op = new JOptionPane(pPnl, JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

      JDialog dlg = op.createDialog("Who Goes There?");

      // Wire up FocusListener to ensure JPasswordField is able to request focus when the dialog is first shown.
      dlg.addWindowFocusListener(new WindowAdapter() {
        @Override
        public void windowGainedFocus(WindowEvent e) {
            pPnl.gainedFocus();
        }
      });

      if (op.getValue() != null && op.getValue().equals(JOptionPane.OK_OPTION)) {
          String password = new String(pPnl.getPassword());
          System.err.println("You entered: " + password);
      }
  }
}

4voto

OnResolve Points 2778

Vous pouvez créer votre propre boîte de dialogue qui étend JDialog, puis vous pouvez y mettre ce que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X