2012-01-16 65 views
40

JOptionPane se puede utilizar para obtener entradas de cadena del usuario, pero en mi caso, quiero mostrar un campo de contraseña en showInputDialog.JOptionPane para obtener la contraseña

La forma en que necesito es que la entrada dada por el usuario debe ser enmascarada y el valor de retorno debe estar en char[]. Necesito un cuadro de diálogo con un mensaje, un campo de contraseña y dos botones. ¿Se puede hacer eso? Gracias.

Respuesta

60

Sí, es posible usando JOptionPane.showOptionDialog(). Algo como esto:

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)); 
} 
+4

JPasswordField (10) no acepta las contraseñas son más largas que 10. Es mejor hacer esto mucho más amplio o usar el constructor no-arg como @Adamski a continuación. También OK debería ser la opción predeterminada, ya que muchos usuarios dejarán de usar Intro después de escribir su contraseña. Si Cancelar es el predeterminado, escribir la contraseña y luego ingresar simplemente cancelará el diálogo. – gb96

+0

esta es una buena, una etiqueta con JPasswordField en JOptionPane y en mi caso acepta una contraseña de más de 10. –

+3

¿Cómo se da al campo de contraseña el foco cuando aparece el cuadro de diálogo? – mjaggard

4

Puede crear su propio cuadro de diálogo que amplíe JDialog y luego puede poner lo que desee en él.

32

Lo más fácil es utilizar JOptionPane 's showConfirmDialog método y pasar de una referencia a un JPasswordField; p.ej.

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); 
} 

Editar

A continuación se muestra un ejemplo utilizando una costumbre JPanel para mostrar un mensaje junto con la JPasswordField. Según el comentario más reciente, también (apresuradamente) agregué código para permitir que el JPasswordField se enfoque cuando se muestra el cuadro de diálogo por primera vez.

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); 
     } 
    } 
} 
+0

Justo lo que estaba buscando. BTW ¿hay alguna forma de ** establecer la cadena de mensaje/cuerpo ** de ese cuadro de diálogo? – InamTaj

+0

La manera más fácil de crear un JPanel que contiene tanto el JPasswordField como una JLabel que contiene el texto deseado. – Adamski

+0

Ya lo sé, pero no quiero abrir otro marco durante la ejecución de la aplicación. Así que quería usar su solución con ** cadena de mensaje **. – InamTaj

3

Este diálogo se ve mucho mejor si lo hace

dlg.setVisible(true); 

Sin eso no se puede ver en absoluto.

también

pPnl.gainedFocus(); 

debería ser

pPnl.gainedFocus(); 

Aparte de eso funciona muy bien. Gracias por el código. Me salvó el tiempo dando vueltas con Swing.

Además, si usted no quiere dejar el diálogo se ejecuta en segundo plano cada vez que lo abra, tendrá que cerrarla con algo como

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