我正在尝试找到实际呈现JPassword字段的方法。也许render不是一个合适的词,所以事情是这样的:
我正在尝试使JPassword字段显示不同的字符数,而不是与我键入的实际密码相同的长度。例如,如果我键入123456作为密码并将setEchoChar((字符)值)设置为"#“
密码如下:###
我希望能够生成随机数量的星星来显示:###
例如,如果数字是10。(当然没有空格)
我可以通过添加几个侦听器来检测更改,然后获取文本并将其替换为我创建的掩码,但这并不令人满意,我希望能够更改实际对象的行为。小挑战不会有什么坏处,对吧?:)我已经准备好接受任何建议了。谢谢。
发布于 2011-01-27 07:58:56
我想我找到了一种“正确”的解决方案,尽管我现在没有设法实现它。下面是一些小贴士:
回声字符被PasswordView.drawEchoCharacter()淹没。这是受保护的方法。它可以被覆盖,因此您可以根据需要绘制任意多个字符。PasswordView的实例由BasicPassworFieldUI.create(Element)创建。BasicPassworFieldUI的实例由JComponent.setUI()分配。
所以,我的建议是:
我实现了所有这些,但是尽管我的方法被调用了,它仍然不能工作。我相信错误是在我的drawEchoCharacter()的返回值中出现的。现在是凌晨2点,我不会修复这个bug,但我相信你可以。
我祝你好运,并会很高兴知道你成功地解决了这个问题。
下面是我的代码:
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-27 07:03:33
我不太确定这一点,但也许一个自定义的Highlighter就可以做到这一点?
passwordField.setHighlighter(new MySpecialPasswordHighlighter());https://stackoverflow.com/questions/4810777
复制相似问题