Как я могу задать фокус этого поля для пароля? - PullRequest
5 голосов
/ 13 июля 2011

Это может показаться тривиальным, но я не могу понять, как задать поле пароля в этом диалоговом окне.

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» получает фокус.

stacktrace (см. Ответ Eng.Fouad):

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

Ответы [ 4 ]

7 голосов
/ 13 июля 2011

Ознакомьтесь с решением, представленным в Dialog Focus .

Edit:

Используя подход, предложенный Энгом Фуадом, я считаю, что код должен быть:

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

Edit2:

Ссылка в записи блога "Dialog Focus" содержит комментарий с предложением, которое работает в Linux.

1 голос
/ 13 июля 2011
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);

Редактировать (by camickr, не стесняйтесь удалять, если это не правильно). Я считаю, что код должен быть:

JPasswordField pass = new JPasswordField(10)         
{
    public void addNotify()             
    {                 
        super.addNotify();
        requestFocusInWindow();             
    }         
}; 
0 голосов
/ 29 января 2014

вот рабочее решение с фокусом в поле пароля и рабочими кнопками

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

0 голосов
/ 13 июля 2011

Проблема в том, что JOptionPane полностью самодостаточен и, похоже, не предлагает способа указать, какой компонент GUI получает первоначальный фокус.Одним из решений было бы написать свой собственный подкласс Dialog - это позволит вам точно контролировать макет и правильно настраивать фокус.

Вы также можете попробовать javax.swing.SwingWorker.Вы можете создать один из них и запустить его ДО показа диалога с паролем.В методе doInBackground () спите в течение короткого времени, в методе done () используйте SwingUtilties.invokeLater (), а в этом Runnable выполните pass.requestFocusInWindow ().

...