有没有替代JPasswordField?

当input一个密码短语时

yeast bulk seize is shows pain 

每个人都可以听到轻敲空格键,所以显示密码字段中的空格也是合乎逻辑的。 所以我想要能展示的东西

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

代替

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

这将使打字更容易,而不会降低安全性。


UPDATE

在更新Riduidel的评论之前请三思。 当布鲁斯·施奈尔(Bruce Schneier)写道: “现在是时候以明文forms显示大多数密码了” ,然后显示一小部分密码也必须是正确的。 特别performance出可以简单地通过聆听捕捉的部分。

下面是一个使用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只是一个简单的覆盖渲染器组件的JTextField ,但似乎并非如此。

所以,不要改变渲染器(就像JTextField有这样的组件),你必须使用一个带有自定义DocumentJTextField ,它包含两个string:

  1. 密码文本由用户写入
  2. 显示密码

您必须确保所有的Document修改方法都会更改密码文本,而所有的渲染方法都使用显示的方法。