Рендеринг Java JPasswordField? - PullRequest
       17

Рендеринг Java JPasswordField?

6 голосов
/ 27 января 2011

Я пытаюсь найти метод, который фактически отображает поле JPassword.Возможно, render - это не то слово, поэтому сделайте следующее:

Я пытаюсь, чтобы поле JPassword показывало другое количество символов, а не ту же длину, что и фактический пароль, который я набираю.Например, если я введу 123456 для пароля и установлю значениеEchoChar ((Character)) в «#»

Пароль будет выглядеть так: # # # # # #
Я хочу иметь возможностьсгенерируйте случайное число звезд, чтобы показать: # # # # # # # # # #
, если число было, например, 10.(Без пробелов, конечно)

Я смог сделать это, просто добавив пару слушателей, чтобы обнаружить изменения, затем взять текст и заменить его маской, которую я создаю, но это не удовлетворяет, я хочучтобы иметь возможность изменить поведение реального объекта.Небольшой вызов не повредит, верно?:) Я готов к любым предложениям.Спасибо.

Ответы [ 2 ]

1 голос
/ 27 января 2011

Я думаю, что нашел способ «правильного» решения, хотя мне не удалось реализовать его сейчас.Вот советы:

эхо-символ заглушается PasswordView.drawEchoCharacter ().Это защищенный метод.Его можно переопределить, поэтому вы можете нарисовать столько символов, сколько захотите.Экземпляр PasswordView создается с помощью BasicPassworFieldUI.create (Element).Экземпляр BasicPassworFieldUI назначается JComponent.setUI ().

Итак, я бы посоветовал:

  1. Реализация MyPasswordView расширяет PasswordView и переопределяет drawEchoCharacter ()
  2. Реализация MyPasswordUI extends BasicPasswordFieldUI , которая переопределяет Просмотр create (Element elem) и создает экземпляр MyPasswordView.
  3. Переопределите setUI () для JPasswordField и установите их 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);
        }
    }
}
0 голосов
/ 27 января 2011

Я не совсем уверен в этом, но может быть, пользовательский Маркер может сделать это?

...