2011-01-26 11 views
6

Sto cercando di trovare il metodo che rende effettivamente il campo JPassword. Forse il rendering non è la parola giusta, quindi ecco l'affare:Rendering Java JPasswordField?

Sto provando a fare in modo che il campo JPassword mostri un numero diverso di caratteri invece della stessa lunghezza della password effettiva che sto digitando. Per esempio, se di tipo 123456 per il (valore (Personaggio)) setEchoChar password e su "#"

La password mostrerebbe come questo: # # # # # #
voglio essere in grado di generare un numero casuale di stelle da mostrare: # # # # # # # # # # #
se il numero era 10 per esempio. (Senza spazi ovviamente)

Sono stato in grado di farlo aggiungendo solo un paio di listener per rilevare le modifiche, quindi prendere il testo e sostituirlo con una maschera che creo, ma non è soddisfacente, voglio essere in grado di cambiare il comportamento dell'oggetto reale. Una piccola sfida non farà male, giusto? :) Sono pronto per qualsiasi suggerimento. Grazie.

risposta

0

Non sono sicuro di questo, ma forse una personalizzazione Highlighter può raggiungere questo obiettivo?

passwordField.setHighlighter(new MySpecialPasswordHighlighter()); 
1

Penso di aver trovato un modo di "giusta" soluzione anche se non sono riuscito a implementarlo ora. Ecco i suggerimenti:

il carattere di eco viene annegato da PasswordView.drawEchoCharacter(). Questo è un metodo protetto. Può essere sovrascritto, quindi puoi disegnare tutti i personaggi che vuoi. L'istanza di PasswordView è creata da BasicPassworFieldUI.create (Element). L'istanza di BasicPassworFieldUI viene assegnata da JComponent.setUI().

Quindi, il modo in cui io suggerirei è:

  1. Implementare MyPasswordView estende PasswordView e sovrascrive drawEchoCharacter()
  2. Implementare MyPasswordUI estende BasicPasswordFieldUI che sostituisce CREATE VIEW (Element elem) e crea l'istanza di MyPasswordView.
  3. Override setUI() di JPasswordField e impostare MyPasswordUI.

Ho implementato tutto questo ma ancora non funziona nonostante vengano chiamati i miei metodi. Credo che l'errore sia nel valore di ritorno del mio drawEchoCharacter(). Sono le 2 del mattino e non correggerò il bug, ma credo che tu possa farlo.

Vi auguro buona fortuna e sarò felice di sapere che siete riusciti a risolvere questo problema.

Ecco il mio codice:

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