JOptionPane pour obtenir un mot de passe

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

La manière dont j’ai besoin est que l’entrée fournie par l’utilisateur soit masquée et la valeur de retour doit être dans char[] . J’ai besoin d’une boîte de dialog avec un message, un champ de mot de passe et deux boutons. Est-ce que cela peut être fait? Merci.

Oui, c’est possible avec 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); Ssortingng[] options = new Ssortingng[]{"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 Ssortingng(password)); } 

Le plus simple est d’utiliser la méthode showConfirmDialog et de transmettre une référence à un JPasswordField ; par exemple

 JPasswordField pf = new JPasswordField(); int okCxl = JOptionPane.showConfirmDialog(null, pf, "Enter Password", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); if (okCxl == JOptionPane.OK_OPTION) { Ssortingng password = new Ssortingng(pf.getPassword()); System.err.println("You entered: " + password); } 

modifier

Vous trouverez ci-dessous un exemple d’utilisation d’un JPanel personnalisé pour afficher un message avec le JPasswordField . Selon le commentaire le plus récent, j’ai aussi (à la hâte) ajouté du code pour permettre à JPasswordField de se concentrer lorsque la boîte de dialog 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(Ssortingng[] 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)) { Ssortingng password = new Ssortingng(pPnl.getPassword()); System.err.println("You entered: " + password); } } } 

Vous pouvez créer votre propre boîte de dialog qui étend JDialog et vous pouvez y mettre tout ce que vous voulez.

Ce dialog semble beaucoup mieux si vous faites

 dlg.setVisible(true); 

Sans cela, vous ne pouvez pas le voir du tout.

Aussi

 pPnl.gainedFocus(); 

devrait être

 pPnl.gainedFocus(); 

Autre que cela fonctionne très bien. Merci pour le code. M’a sauvé le temps face à Swing.

De plus, si vous ne voulez pas laisser le dialog en arrière-plan chaque fois que vous l’ouvrez, vous devrez le fermer avec quelque chose comme:

 dlg.dispatchEvent(new WindowEvent(dlg, WindowEvent.WINDOW_CLOSING)); dlg.dispose(); // else java VM will wait for dialog to be disposed of (forever) 

La classe suivante est une extension de la réponse d’ Adamski :

 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 Ssortingng getPasswordSsortingng() { SsortingngBuilder passBuilder = new SsortingngBuilder(); char[] pwd = this.getPassword(); if (pwd.length > 0) { for (char c : pwd) { passBuilder.append(c); } } return passBuilder.toSsortingng(); } private static Ssortingng displayDialog ( Component parent, final PasswordPanel panel, Ssortingng title ) { Ssortingng 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.getPasswordSsortingng(); } return password; } public static Ssortingng showDialog (Component parent, Ssortingng title) { final PasswordPanel pPnl = new PasswordPanel(); return displayDialog(parent, pPnl, title); } public static Ssortingng showDialog ( Component parent, Ssortingng title, int passwordLength ) { final PasswordPanel pPnl = new PasswordPanel(passwordLength); return displayDialog (parent, pPnl, title); } public static Ssortingng showDialog (Ssortingng title) { return showDialog(null, title); } public static Ssortingng showDialog (Ssortingng title, int passwordLength) { return showDialog(null, title, passwordLength); } /** * Show a test dialog */ public static void main(Ssortingng[] args) { Ssortingng test = PasswordPanel.showDialog ("Enter Your Password"); System.out.println ("Entered Password: " + test); System.exit(0); } }