java - password - JOptionPane para obtener la contraseña
showinputdialog contraseña (4)
JOptionPane
se puede utilizar para obtener entradas de cadena del usuario, pero en mi caso, quiero mostrar un campo de contraseña en showInputDialog
.
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.
Este diálogo se ve mucho mejor si lo haces
dlg.setVisible(true);
Sin eso no puedes verlo en absoluto.
también
pPnl.gainedFocus();
debiera ser
pPnl.gainedFocus();
Aparte de eso, funciona genial. Gracias por el código. Me salvó el tiempo dando vueltas con Swing.
Además, si no desea que el diálogo se ejecute en segundo plano cada vez que lo abra, deberá cerrarlo con algo así como
dlg.dispatchEvent(new WindowEvent(dlg, WindowEvent.WINDOW_CLOSING));
dlg.dispose(); // else java VM will wait for dialog to be disposed of (forever)
Lo más fácil es usar el método showConfirmDialog
JOptionPane
y pasar una referencia a 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 con un JPanel
personalizado para mostrar un mensaje junto con JPasswordField
. Según el comentario más reciente, también (apresuradamente) agregué código para permitir que JPasswordField
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);
}
}
}
Puedes crear tu propio diálogo que amplíe JDialog y luego puedes poner lo que quieras en él.
Sí, es posible usar 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));
}