这看似微不足道,但我无法弄清楚如何在此对话框中给出密码框。
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
public class PasswordBox {
@SuppressWarnings("unused")
public String prompt() {
JPasswordField pass = new JPasswordField(10);
int action = JOptionPane.showConfirmDialog(null, pass,"Enter Password",JOptionPane.OK_CANCEL_OPTION);
return new String(pass.getPassword());
}
}
我从其他类调用它:String tmpPASS = new PasswordBox().prompt();
出于某种原因,当对话框出现时,“确定”按钮会获得焦点。
stacktrace(参见Eng.Fouad的回答):
at javax.swing.JComponent.addNotify(Unknown Source)
at PasswordBox$1.addNotify(PasswordBox.java:14)
at java.awt.Container.addNotify(Unknown Source)
答案 0 :(得分:7)
查看Dialog Focus中提供的解决方案。
编辑:
使用Eng Fouad建议的方法我相信代码应该是:
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
super.addNotify();
requestFocusInWindow();
}
};
EDIT2:
“Dialog Focus”博客条目中的链接包含一条评论,其中包含适用于Linux的建议。
答案 1 :(得分:1)
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
public JOptionPane pane;
public class PasswordBox
{
@SuppressWarnings("unused")
public String prompt()
{
pane = new JOptionPane();
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
pane.addNotify();
requestFocus();
}
};
int action = pane.showConfirmDialog(null, pass,"Enter Password",JOptionPane.OK_CANCEL_OPTION);
return new String(pass.getPassword());
}
}
或者这是另一种方法:
JPanel panel = new JPanel();
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
panel.addNotify();
requestFocus();
}
};
panel.add(pass);
JOptionPane pane = new JOptionPane();
JButton btnOK = new JButton("OK");
JButton btnCancel = new JButton("Cancel");
Object[] options = {btnOK, btnCancel};
pane.showOptionDialog(null, panel, "Enter the password", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, null);
编辑(通过camickr,如果这不正确,请随意删除)。我相信代码应该是:
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
super.addNotify();
requestFocusInWindow();
}
};
答案 2 :(得分:0)
问题是JOptionPane是完全自包含的,似乎无法指定哪个GUI组件获得初始焦点。一种解决方案是编写自己的Dialog子类 - 这将让您准确地控制布局并适当地设置焦点。
您也可以尝试使用javax.swing.SwingWorker。您可以创建其中一个并在显示密码对话框之前启动它。在doInBackground()方法中,睡眠一小段时间,在done()方法中使用SwingUtilties.invokeLater()并在该Runnable中发出pass.requestFocusInWindow()。
答案 3 :(得分:0)
这是一个工作解决方案,重点是密码字段和工作按钮