我想我找到了一種「正確」的解決方案,雖然我現在還沒有設法實現它。以下是提示:
回顯字符被PasswordView.drawEchoCharacter()淹沒。這是受保護的方法。它可以被覆蓋,所以你可以繪製任意數量的字符。 PasswordView的實例由BasicPassworFieldUI.create(Element)創建。 BasicPassworFieldUI的實例由JComponent.setUI()分配。
所以,我建議的方法是:
- 實施MyPasswordView延伸PasswordView和覆蓋drawEchoCharacter()
- 實施MyPasswordUI延伸BasicPasswordFieldUI重寫視圖中創建(元ELEM )並創建MyPasswordView的實例。
- 覆蓋setUI() JPasswordField並設置其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);
}
}
}