繁体   English   中英

渲染Java JPasswordField?

[英]Rendering Java JPasswordField?

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

我试图让JPassword字段显示不同数量的字符,而不是与我输入的实际密码长度相同。 例如,如果我输入密码123456和setEchoChar((字符)值)为“#”

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

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

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

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

所以,我建议的方式是:

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

我实现了所有这些,但它仍然无法工作,虽然我的方法被调用。 我相信这个bug是我的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);
        }
    }
}

我对此并不十分肯定,但也许定制荧光笔可以实现这一目标吗?

passwordField.setHighlighter(new MySpecialPasswordHighlighter());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM