【问题标题】:how to peek password while typing in JPasswordField如何在输入 JPasswordField 时查看密码
【发布时间】:2016-01-15 15:48:46
【问题描述】:

我想创建一个JPasswordField,在那里我可以在打字时看到字符, 我尝试了passtxt.setEchoChar((char) 0);,但它完全将'*' 更改为文本 我不要这个, 我想在逐个字符输入的同时查看文本 (正如我们在移动浏览器中看到的那样) 谢谢

import java.awt.BorderLayout;
import java.awt.Checkbox;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class Main {
  public static void main(String args[]) {
    JFrame f = new JFrame("JPasswordField  ");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel p=new JPanel();
    p.add(new JLabel("Username"));
    p.add(new JTextField(20));
     p.add(new JLabel("Password"));
    JPasswordField jpassword = new JPasswordField(20);

    p.add(jpassword);

    Checkbox c=new Checkbox("type password and click");
    c.addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                jpassword.setEchoChar('*');
            } else {
                jpassword.setEchoChar((char) 0);
            }
        }
    });
    jpassword.setEchoChar((char)0); 
    p.add(c);
    f.add(p);
    f.setSize(300, 200);
    f.setVisible(true);


  }
}

【问题讨论】:

  • 请发布Runnable Example,我们可以复制粘贴并查看您的程序运行时遇到的问题与您看到的相同,它应该尽可能短,但要包含足够的代码,以便我们进行测试。这将导致更少的混乱,更多,更快和更好的答案:)
  • JPasswordField 没有这样的功能(因为它在 PC 环境中并不是真正需要的),但是您可以扩展该类并很快自己实现它...
  • 如何扩展类来实现它
  • @vinaynegi 如果您不知道如何扩展类,请获取 Java 初学者书籍。这里真的不是像继承一样学习 Java 101 的地方。
  • 您想在隐藏之前短暂显示角色吗?

标签: java swing jpasswordfield


【解决方案1】:

这是一个简单的解决方案。使用 JTextField 而不是 JPasswordField 和 String 成员分别存储真实密码:

private JTextField textField = new JTextField();
private String password = "";

实现java.awt.event.KeyListener,并像这样覆盖keyReleased

public void keyReleased(KeyEvent e) {
    if (Character.isLetter(e.getKeyChar()) || 
        Character.isDigit(e.getKeyChar())) { //Add other valid characters as needed

        //Get text and last typed character
        String text = textField.getText();
        char typed = text.charAt(text.length()-1);
        //store typed letter separately for later use
        password += (text.length() > 0) ? typed : "";

        StringBuilder sb = new StringBuilder();
        for (int c=0; c<text.length()-1; c++) {
            sb.append("*");
        }
        sb.append(typed);

        //set password with asterisks, for authentication use member: password
        textField.setText(sb.toString());
}

将侦听器添加到文本字段,您就完成了。

这将在任何时候输入一个新的字母或数字时覆盖除最后一个输入的字符以外的所有字符。

【讨论】:

  • 不是您的反对者,但您不想将 KeyListener 与 JTextField 一起使用,因为这样做可能会对它的功能产生重大不利影响。我不是这方面的专家,必须听从 MadProgrammer 的回答和对类似问题的 cmet(本网站上主要的 Swing 专家之一)。替代方案可能包括使用 DocumentFilter。
  • @HovercraftFullOfEels 我不太同意。如果你看这个官方教程,我不是唯一一个:docs.oracle.com/javase/tutorial/uiswing/examples/events/… 但我同意应该对关键事件进行一些过滤。我一会儿再补充。
  • @HovercraftFullOfEels 我刚刚找到了我正在寻找的问题,并在问题的 cmets 部分发布了一个链接。虽然它没有公认的答案,但垃圾神链接了一个非常相似的解决方案。我不能再对这个问题投票了(撤回了我的“无 MCVE”投票),但你可能想考虑看看它。
猜你喜欢
  • 2012-10-05
  • 2012-10-29
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多