Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设置此密码字段焦点?_Java_Swing_Passwords_Joptionpane_Jpasswordfield - Fatal编程技术网

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
,只需将其设置为类字段,查看更新我仍然无法使用第一个解决方案,但第二个解决方案给了我一个堆栈跟踪。我将把它添加到我的问题中。