Esiste un’alternativa a JPasswordField?

Quando si digita una passphrase come

yeast bulk seize is shows pain 

tutti possono sentire toccando la barra spaziatrice, quindi sembra logico visualizzare anche gli spazi nel campo della password. Quindi mi piacerebbe qualcosa in grado di mostrare

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

invece di

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

Ciò renderebbe più semplice la digitazione senza ridurre la sicurezza.


AGGIORNARE

Pensaci due volte prima di aggiornare il commento di Riduidel. Quando Bruce Schneier scrive “È ora di mostrare la maggior parte delle password in chiaro” , quindi anche una piccola parte di esso deve essere corretta. Soprattutto mostrando una parte che può essere catturata semplicemente ascoltando.

Ecco una variazione che utilizza setEchoChar() per rendere la password visibile per un tempo predefinito: tre secondi per esempio.

 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 actionPerformsd(ActionEvent e) { pwf.setEchoChar(echoChar); } } 

JPasswordField che JPasswordField fosse semplicemente un JTextField semplicemente sovrascrivendo il componente di rendering, ma non sembra essere il caso.

Quindi, invece di modificare il renderer (come sarebbe nel caso in cui JTextField avesse un tale componente), dovrai usare un JTextField con un Document personalizzato contenente due stringhe:

  1. Testo della password come scritto dall’utente
  2. Password visualizzata

Dovrai assicurarti che tutti i metodi di modifica del Document cambino il testo della password, mentre tutti i metodi di rendering usano quello visualizzato.