5

これは些細なことのように思えるかもしれませんが、このダイアログのパスワード ボックスにフォーカスを与える方法がわかりません。

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

何らかの理由で、ダイアログが表示されると、[OK] ボタンがフォーカスされます。

スタックトレース(Eng.Fouadの回答を参照):

at javax.swing.JComponent.addNotify(Unknown Source)
at PasswordBox$1.addNotify(PasswordBox.java:14)
at java.awt.Container.addNotify(Unknown Source)
4

4 に答える 4

7

Dialog Focusに示されているソリューションを確認してください。

編集:

Eng Fouad によって提案されたアプローチを使用すると、コードは次のようになるはずです。

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

編集2:

「Dialog Focus」ブログ エントリのリンクには、Linux で動作する提案を含むコメントがあります。

于 2011-07-13T14:13:43.180 に答える
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();             
    }         
}; 
于 2011-07-13T14:53:04.450 に答える
0

問題は、JOptionPane が完全に自己完結型であり、どの GUI コンポーネントが最初のフォーカスを取得するかを指定する方法を提供していないように見えることです。1 つの解決策は、Dialog の独自のサブクラスを作成することです。これにより、レイアウトを正確に制御し、フォーカスを適切に設定できます。

javax.swing.SwingWorker を試すこともできます。これらのいずれかを作成し、パスワード ダイアログを表示する前に起動できます。doInBackground() メソッドで短時間スリープし、done() メソッドで SwingUtilties.invokeLater() を使用し、その Runnable 内で pass.requestFocusInWindow() を発行します。

于 2011-07-13T14:40:36.580 に答える