繁体   English   中英

我怎样才能给这个密码字段焦点?

[英]How can I give this password field focus?

这可能看起来微不足道,但我不知道如何在此对话框焦点中指定密码框。

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)

查看Dialog Focus中提供的解决方案。

编辑:

使用 Eng Fouad 建议的方法,我相信代码应该是:

JPasswordField pass = new JPasswordField(10)         
{
    public void addNotify()             
    {                 
        super.addNotify();
        requestFocusInWindow();             
    }         
}; 

编辑2:

“对话焦点”博客条目中的链接有一条评论,其中包含适用于 Linux 的建议。

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();             
    }         
}; 

这是一个工作解决方案,重点是密码字段和工作按钮

https://stackoverflow.com/a/21426340/2110961

问题是 JOptionPane 是完全独立的,并且似乎无法指定哪个 GUI 组件获得初始焦点。 一种解决方案是编写您自己的 Dialog 子类 - 这将使您可以准确控制布局并适当地设置焦点。

你也可以试试 javax.swing.SwingWorker。 您可以创建其中一个并在显示密码对话框之前启动它。 在 doInBackground() 方法中,休眠一小段时间,在 done() 方法中使用 SwingUtilties.invokeLater() 并在 Runnable 中发出 pass.requestFocusInWindow()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM