首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >渲染Java JPasswordField?

渲染Java JPasswordField?
EN

Stack Overflow用户
提问于 2011-01-27 06:26:31
回答 2查看 821关注 0票数 6

我正在尝试找到实际呈现JPassword字段的方法。也许render不是一个合适的词,所以事情是这样的:

我正在尝试使JPassword字段显示不同的字符数,而不是与我键入的实际密码相同的长度。例如,如果我键入123456作为密码并将setEchoChar((字符)值)设置为"#“

密码如下:###

我希望能够生成随机数量的星星来显示:###

例如,如果数字是10。(当然没有空格)

我可以通过添加几个侦听器来检测更改,然后获取文本并将其替换为我创建的掩码,但这并不令人满意,我希望能够更改实际对象的行为。小挑战不会有什么坏处,对吧?:)我已经准备好接受任何建议了。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2011-01-27 07:58:56

我想我找到了一种“正确”的解决方案,尽管我现在没有设法实现它。下面是一些小贴士:

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

所以,我的建议是:

  1. Implement扩展了PasswordView和overrides扩展了覆盖视图create(Element elem)和create instance of setUI() of JPasswordField并设置其MyPasswordUI的视图。

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

我祝你好运,并会很高兴知道你成功地解决了这个问题。

下面是我的代码:

代码语言:javascript
复制
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);
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2011-01-27 07:03:33

我不太确定这一点,但也许一个自定义的Highlighter就可以做到这一点?

代码语言:javascript
复制
passwordField.setHighlighter(new MySpecialPasswordHighlighter());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4810777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档