Есть ли альтернатива JPasswordField? - PullRequest
2 голосов
/ 17 марта 2011

При вводе ключевой фразы, например

yeast bulk seize is shows pain

каждый может услышать нажатие клавиши пробела, поэтому логично также отобразить пробелы в поле пароля. Так что я хотел бы что-то, способное показать

***** **** ***** ** ***** ****

вместо

******************************

Это упростит набор текста и вряд ли уменьшит безопасность.


UPDATE

Подумайте дважды, прежде чем обновлять комментарий Riduidel. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 "*." Особенно показывает часть, которая может быть захвачена простым слушанием.

Ответы [ 2 ]

4 голосов
/ 17 марта 2011

Думал, JPasswordField был просто JTextField, просто переопределяющим компонент рендерера, но, похоже, это не так.

Таким образом, вместо смены рендерера (как в случае, если бы JTextField имел такой компонент), вам придется использовать JTextField с пользовательским удерживанием Document две строки:

  1. Текст пароля, написанный пользователем
  2. Отображаемый пароль

Необходимо убедиться, что все Document изменяющие методы изменяют текст пароля, тогда как все методы рендеринга используют отображаемый.

3 голосов
/ 17 марта 2011

Вот вариант, который использует setEchoChar(), чтобы сделать пароль видимым в течение предопределенного времени: например, три секунды.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.Timer;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

/** @see http://stackoverflow.com/questions/5339702 */
public class PasswordTest {

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }

    private static void createAndShowGui() {
        JFrame jf = new JFrame("Test Password");
        JPasswordField jpwd = new JPasswordField();
        TimedPasswordListener tpl = new TimedPasswordListener(jpwd);
        jpwd.getDocument().addDocumentListener(tpl);
        jf.add(jpwd);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLocationRelativeTo(null);
        jf.pack();
        jf.setVisible(true);
    }
}

class TimedPasswordListener implements DocumentListener, ActionListener {

    private Timer timer = new Timer(3000, this);
    private char echoChar;
    private JPasswordField pwf;

    public TimedPasswordListener(JPasswordField jp) {
        pwf = jp;
        timer.setRepeats(false);
    }

    public void insertUpdate(DocumentEvent e) {
        showText(e);
    }

    public void removeUpdate(DocumentEvent e) {
        showText(e);
    }

    public void changedUpdate(DocumentEvent e) {}

    public void showText(DocumentEvent e) {
        if (0 != pwf.getEchoChar()) {
            echoChar = pwf.getEchoChar();
        }
        pwf.setEchoChar((char) 0);
        timer.restart();
    }

    public void actionPerformed(ActionEvent e) {
        pwf.setEchoChar(echoChar);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...