我如何请求关注 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 以获得可重复使用的解决方案。
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 以获得可重复使用的解决方案。