簡體   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