我想我找到了一种“正确”解决方案的方法,尽管我现在没有设法实施它。以下是提示:
回显字符被 PasswordView.drawEchoCharacter() 淹没。这是受保护的方法。它可以被覆盖,因此您可以绘制任意数量的字符。PasswordView 的实例由 BasicPassworFieldUI.create(Element) 创建。BasicPassworFieldUI 的实例由 JComponent.setUI() 分配。
所以,我建议的方式是:
- 实现 MyPasswordView 扩展PasswordView并覆盖drawEchoCharacter()
- 实现 MyPasswordUI 扩展了覆盖View create(Element elem)并创建 MyPasswordView 实例的 BasicPasswordFieldUI 。
- 覆盖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);
}
}
}