我如何请求关注 JOptionPane 中的 JPasswordField?

How do I request focus on a JPasswordField inside a JOptionPane?

I've learned in this other question that it's possible by overriding the addNotify method,但这不起作用。这是我的代码:

private boolean accessPasswordFrame(String titleText, String labelText, String errorMessage, int accessType) {
    JPasswordField passwordField = new JPasswordField() {
        public void addNotify() {
            super.addNotify();
            requestFocus();
        }
    };
    final JComponent[] inputs = new JComponent[] {
        new JLabel(labelText),
        passwordField
    };
    int result = JOptionPane.showConfirmDialog(frame, inputs, titleText, JOptionPane.OK_CANCEL_OPTION);
    if (result == JOptionPane.OK_OPTION) {
        String rootPass = new String(passwordField.getPassword());
        if (accessType == ADMIN_TYPE) {
            if (rootPass.equals(ROOT_PASSWORD)) {
                return true;
            } else {
                JOptionPane.showMessageDialog(null,
                        errorMessage, "Erro",
                        JOptionPane.ERROR_MESSAGE);
            }
        } else if (accessType == USER_TYPE) {
            if (PasswordFrame.getPasswords() != null) {
                for (Map.Entry<String, String> e : PasswordFrame.getPasswords().entrySet()) {
                    if (rootPass.equals(e.getValue())) {
                        lastUser = e.getKey();
                        return true;
                    } else {
                        JOptionPane.showMessageDialog(null,
                                errorMessage, "Erro",
                                JOptionPane.ERROR_MESSAGE);
                    }
                }
            } else {
                JOptionPane.showMessageDialog(null,
                        "Usuários cadastrados não existem.", "Erro",
                        JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    return false;
}

JOptionPane 出现后,默认焦点位于 "Ok" 按钮上:

如果我只是 requestFocus() 在显示对话框之前,它也不起作用。

您可以向组件添加侦听器,以便在选项窗格可见时调用侦听器,然后您可以请求将焦点放在组件上。

查看 Dialog Focus 中的 RequestFocusListener class 以获得可重复使用的解决方案。