私は今それを実装することができませんでしたが、「正しい」ソリューションへの方法を見つけたと思います。ヒントは次のとおりです。
エコー文字は 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);
}
}
}