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.