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

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

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

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

最佳答案

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

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

因此,我建议的方式是:

  • 实现MyPasswordView扩展了 PasswordView 并覆盖了 drawEchoCharacter()
  • 实现MyPasswordUI扩展了 BasicPasswordFieldUI ,它覆盖了 View create(Element elem)并创建MyPasswordView的实例。
  • 重写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);
            }
        }
    }
    

    关于java - 渲染Java JPasswordField吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4810777/

    10-09 03:45