Я думаю, что нашел способ «правильного» решения, хотя мне не удалось реализовать его сейчас.Вот советы:
эхо-символ заглушается PasswordView.drawEchoCharacter ().Это защищенный метод.Его можно переопределить, поэтому вы можете нарисовать столько символов, сколько захотите.Экземпляр PasswordView создается с помощью BasicPassworFieldUI.create (Element).Экземпляр BasicPassworFieldUI назначается JComponent.setUI ().
Итак, я бы посоветовал:
- Реализация MyPasswordView расширяет PasswordView и переопределяет drawEchoCharacter ()
- Реализация MyPasswordUI extends BasicPasswordFieldUI , которая переопределяет Просмотр create (Element elem) и создает экземпляр MyPasswordView.
- Переопределите 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);
}
}
}