Io ho provato a farlo. Inizialmente ho sviluppato questo:
codice:
public static char[] showPasswordDialog(Component parentComponent) {
JPasswordField passwordField = new JPasswordField(20);
Object[] message = { "Inserire password:", passwordField };
int r = JOptionPane.showConfirmDialog(parentComponent, message,
"Autenticazione", JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (r == JOptionPane.OK_OPTION) {
return passwordField.getPassword();
} else {
return null;
}
}
Funziona (compreso <invio> per confermare), l'unico "problema" è che appunto il focus è inizialmente sul pulsante OK, non sul password-field.
Ma sapendo come funziona internamente JOptionPane, ho sviluppato poi questo:
codice:
public static char[] showPasswordDialog(Component parentComponent) {
final JPasswordField passwordField = new JPasswordField(20);
Object[] message = { "Inserire password:", passwordField };
JOptionPane optionPane = new JOptionPane(message,
JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION) {
public void selectInitialValue() {
super.selectInitialValue();
passwordField.requestFocusInWindow();
}
};
JDialog dialog = optionPane.createDialog(parentComponent, "Autenticazione");
dialog.setVisible(true);
dialog.dispose();
if (new Integer(JOptionPane.OK_OPTION).equals(optionPane.getValue())) {
return passwordField.getPassword();
} else {
return null;
}
}
Questo funziona e il focus è inizialmente sul password-field.
Nota come le mie implementazioni siano semplici, pulite e ben incapsulate in un metodo.