Есть ли альтернатива JPasswordField?

При вводе парольной фразы типа

yeast bulk seize is shows pain 

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

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

вместо

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

Это упростило бы типизацию и вряд ли снизило безопасность.


ОБНОВИТЬ

Подумайте дважды, прежде чем обновлять комментарий Riduidel. Когда Брюс Шнайер пишет: «Пришло время показать большинство паролей в ясном тексте» , тогда небольшая часть его тоже должна быть правильной. Особенно показываю часть, которую можно захватить, просто слушая.

Вот вариант, который использует 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); } } 

JPasswordField что JPasswordField просто JTextField просто переопределяет компонент рендеринга, но, похоже, это не так.

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

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

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

  • Установка пароля пользователя root root на OS X
  • Безопасно ли хранить пароли в качестве переменных среды (а не как обычный текст) в файлах конфигурации?
  • Java 256-битное шифрование на основе AES на основе паролей
  • Лучший способ сохранить пароль в базе данных
  • Сделать Android WebView не хранить cookies или пароли
  • Проверка пароля с помощью PBKDF2 в Java
  • Библиотека проверки надежности пароля
  • Когда боты атакуют!
  • Должен ли я поддерживать Unicode в паролях?
  • yii CPasswordHelper: hashPassword и verifyPassword
  • Невозможно импортировать ключевой файл «blah.pfx» - ошибка «Ключ-файл может быть защищен паролем»
  • Давайте будем гением компьютера.