Java 如何设置此密码字段焦点?
这可能看起来很琐碎,但我不知道如何在这个对话框中指定密码框Java 如何设置此密码字段焦点?,java,swing,passwords,joptionpane,jpasswordfield,Java,Swing,Passwords,Joptionpane,Jpasswordfield,这可能看起来很琐碎,但我不知道如何在这个对话框中指定密码框 import javax.swing.JOptionPane; import javax.swing.JPasswordField; public class PasswordBox { @SuppressWarnings("unused") public String prompt() { JPasswordField pass = new JPasswordField(10); in
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的回答):
查看中提供的解决方案
编辑:
使用Eng Fouad建议的方法,我认为代码应为:
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
super.addNotify();
requestFocusInWindow();
}
};
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
super.addNotify();
requestFocusInWindow();
}
};
编辑2:
“Dialog Focus”博客条目中的链接有一条评论,其中建议在Linux上使用。问题在于JopOptions窗格是完全独立的,似乎无法指定哪个GUI组件获得初始焦点。一种解决方案是编写自己的Dialog子类,这样可以精确地控制布局并适当地设置焦点
您也可以尝试javax.swing.SwingWorker。您可以创建其中一个,并在显示密码对话框之前启动它。在doInBackground()方法中,短时间睡眠,在done()方法中使用swingutiles.invokeLater(),并在该可运行文件中发出pass.requestFocusInWindow()
或者这里有另一种方法:
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();
}
};
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
super.addNotify();
requestFocusInWindow();
}
};
这是一个工作解决方案,重点是密码字段和工作按钮
我用AncestorListener尝试了这个解决方案。不幸的是,根本没有调用回调,因此代码不起作用。怎么了?我已经在XP上的JDK6_7上测试过了。可能是版本/平台问题?其中一条评论建议使用分层侦听器。试一试,看看会发生什么。对话框焦点链接中提供的解决方案对我有效!:)使用他在这个答案顶部的对话焦点链接,这对我来说很有效。他不得不在窗格的声明中添加“final”,但仍然不起作用。感谢您的帮助,非常感谢:)@MaxMackie不需要final
,只需将其设置为类字段,查看更新我仍然无法使用第一个解决方案,但第二个解决方案给了我一个堆栈跟踪。我将把它添加到我的问题中。