6

我试图找到实际呈现 JPassword 字段的方法。也许渲染不是正确的词,所以这里是交易:

我试图让 JPassword 字段显示不同数量的字符,而不是与我输入的实际密码相同的长度。例如,如果我输入 123456 作为密码并将 EchoChar((Character)value) 设置为“#”

密码将显示如下:# # # # # #
我希望能够生成随机数量的星星来显示:# # # # # # # # # #
例如,如果数字是 10。(当然没有空格)

我可以通过添加几个侦听器来检测更改然后获取文本并用我创建的掩码替换它来做到这一点,但这并不令人满意,我希望能够改变实际对象的行为。一点点挑战不会有伤害的,对吧?:) 我准备好接受任何建议。谢谢你。

4

2 回答 2

1

我想我找到了一种“正确”解决方案的方法,尽管我现在没有设法实施它。以下是提示:

回显字符被 PasswordView.drawEchoCharacter() 淹没。这是受保护的方法。它可以被覆盖,因此您可以绘制任意数量的字符。PasswordView 的实例由 BasicPassworFieldUI.create(Element) 创建。BasicPassworFieldUI 的实例由 JComponent.setUI() 分配。

所以,我建议的方式是:

  1. 实现 MyPasswordView 扩展PasswordView并覆盖drawEchoCharacter()
  2. 实现 MyPasswordUI 扩展了覆盖View create(Element elem)并创建 MyPasswordView 实例的 BasicPasswordFieldUI
  3. 覆盖JPasswordField 的setUI()并设置它们的 MyPasswordUI。

我实现了所有这些,但尽管调用了我的方法,但它仍然不起作用。我相信这个错误是我的 drawEchoCharacter() 的返回值。现在是凌晨 2 点,我不会修复错误,但我相信你可以。

祝您好运,并且很高兴知道您已成功解决此问题。

这是我的代码:

public class TestPassword {
    public static void main(String[] args) {
        JFrame f = new JFrame();
        JPasswordField p = new JPasswordField() {
            public void setUI(TextUI ui) { 
                super.setUI(new MyPasswordUI());
            }
        };
        //p.setUI(ui)
        //p.setEchoChar('q');
        final Random r = new Random();


        f.add(p);

        f.setSize(100, 100);
        f.setLocation(100, 100);
        f.setVisible(true);
    }


    public static class MyPasswordUI extends BasicPasswordFieldUI {
        public View create(Element elem) {
            return new MyPasswordView(elem);
        }
    }

    public static class MyPasswordView extends PasswordView {
        public MyPasswordView(Element elem) {
            super(elem);
        }
        protected int drawEchoCharacter(Graphics g, int x, int y, char c) {
            super.drawEchoCharacter(g, x, y, c);
            return super.drawEchoCharacter(g, x, y, c);
        }
    }
}
于 2011-01-26T23:58:55.970 回答
0

我不太确定这一点,但也许自定义荧光笔可以做到这一点?

passwordField.setHighlighter(new MySpecialPasswordHighlighter());
于 2011-01-26T23:03:33.417 回答