2011-01-26 10 views
6

Estoy tratando de encontrar el método que realmente representa el campo JPassword. Tal vez renderizar no es la palabra correcta, así que aquí está el trato:Rendering Java JPasswordField?

Estoy tratando de hacer que el campo JPassword muestre un número diferente de caracteres en lugar de la misma longitud que la contraseña real que estoy escribiendo. Por ejemplo, si el tipo i 123456 para la contraseña y (valor (Personaje)) setEchoChar a "#"

La contraseña mostraría así: # # # # # #
Quiero ser capaz de generar una número aleatorio de estrellas para mostrar: # # # # # # # # # #
si el número era 10, por ejemplo. (Sin los espacios por supuesto)

Pude hacerlo simplemente agregando un par de oyentes para detectar cambios, luego tomar el texto y reemplazarlo con una máscara que creo, pero eso no es satisfactorio, quiero ser capaz de cambiar el comportamiento del objeto real. Un pequeño desafío no hará daño, ¿verdad? :) Estoy listo para cualquier sugerencia. Gracias.

Respuesta

0

No estoy muy seguro de esto, pero tal vez un Highlighter personalizado puede lograr esto?

passwordField.setHighlighter(new MySpecialPasswordHighlighter()); 
1

Creo que encontré una forma de solución "correcta" aunque no logré implementarla ahora. Aquí están los consejos:

el carácter de eco es ahogado por PasswordView.drawEchoCharacter(). Este es un método protegido. Se puede anular, para que pueda dibujar tantos caracteres como desee. La instancia de PasswordView es creada por BasicPassworFieldUI.create (Element). La instancia de BasicPassworFieldUI es asignada por JComponent.setUI().

Por lo tanto, la forma en que te sugiero es:

  1. Implementar MyPasswordView extiende PasswordView y anula drawEchoCharacter()
  2. Implementar MyPasswordUI extiende BasicPasswordFieldUI que anula CREATE VIEW (Elemento elem) y crea una instancia de MyPasswordView.
  3. Anular setUI() de JPasswordField y establecer su MyPasswordUI.

Implementé todo esto pero aún no funciona aunque se llaman mis métodos. Creo que el error está en el valor de retorno de mi drawEchoCharacter(). Son las 2AM ahora y no repararé el error, pero creo que puedes.

Le deseo mucha suerte y le complace saber que ha logrado solucionar esto.

Aquí está mi código:

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); 
     } 
    } 
}