6

JPassword フィールドを実際にレンダリングするメソッドを見つけようとしています。render は適切な言葉ではないかもしれません。

JPassword フィールドに、入力している実際のパスワードと同じ長さではなく、異なる文字数を表示させようとしています。たとえば、パスワードに 123456 と入力し、EchoChar((Character)value) を「#」に設定するとします。

パスワードは次のよう
に表示されます
。(もちろんスペース抜きで)

いくつかのリスナーを追加して変更を検出し、テキストを取得して作成したマスクに置き換えるだけでそれを行うことができましたが、それでは満足できません。実際のオブジェクトの動作を変更できるようにしたいと考えています。ちょっとした挑戦も悪くないですよね?:)私はどんな提案も受け入れる準備ができています。ありがとうございました。

4

2 に答える 2

1

私は今それを実装することができませんでしたが、「正しい」ソリューションへの方法を見つけたと思います。ヒントは次のとおりです。

エコー文字は PasswordView.drawEchoCharacter() によって溺れます。これは保護されたメソッドです。オーバーライドできるので、好きなだけキャラクターを描くことができます。PasswordView のインスタンスは、BasicPassworFieldUI.create(Element) によって作成されます。BasicPassworFieldUI のインスタンスは、JComponent.setUI() によって割り当てられます。

したがって、私が提案する方法は次のとおりです。

  1. MyPasswordView の実装はPasswordViewを拡張し、 drawEchoCharacter()をオーバーライドします
  2. MyPasswordUIを実装すると、 View create(Element elem)をオーバーライドして MyPasswordViewのインスタンスを作成する BasicPasswordFieldUI が拡張されます。
  3. 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);
        }
    }
}
于 2011-01-26T23:58:55.970 に答える
0

これについてはよくわかりませんが、カスタム蛍光ペンでこれを実現できるのではないでしょうか。

passwordField.setHighlighter(new MySpecialPasswordHighlighter());
于 2011-01-26T23:03:33.417 に答える