2011-01-26 74 views
6

我正在試圖找到實際呈現JPassword字段的方法。也許渲染不是正確的字,所以這裏是交易:呈現Java JPasswordField?

我想讓JPassword字段顯示不同數量的字符,而不是與我輸入的實際密碼相同的長度。 例如,如果我輸入密碼,並setEchoChar((角色)值)類型123456「#」

的密碼會顯示這樣的:######
我希望能夠生成一個隨機數顯示星號:############################
例如數字爲10。 (當然沒有空格)

我能夠做到這一點,只需添加幾個偵聽器來檢測變化,然後採取文本,並用我創建的掩碼替換它,但那不令人滿意,我想成爲能夠改變實際對象的行爲。一點挑戰不會傷害,對吧? :) 我準備好任何建議。 謝謝。

回答

0

我對此不太確定,但也許自定義Highlighter可以完成這個?

passwordField.setHighlighter(new MySpecialPasswordHighlighter()); 
1

我想我找到了一種「正確」的解決方案,雖然我現在還沒有設法實現它。以下是提示:

回顯字符被PasswordView.drawEchoCharacter()淹沒。這是受保護的方法。它可以被覆蓋,所以你可以繪製任意數量的字符。 PasswordView的實例由BasicPassworFieldUI.create(Element)創建。 BasicPassworFieldUI的實例由JComponent.setUI()分配。

所以,我建議的方法是:

  1. 實施MyPasswordView延伸PasswordView和覆蓋drawEchoCharacter()
  2. 實施MyPasswordUI延伸BasicPasswordFieldUI重寫視圖中創建(元ELEM )並創建MyPasswordView的實例。
  3. 覆蓋setUI() JPasswordField並設置其MyPasswordUI。

我實現了所有這些,但它仍然不起作用,雖然我的方法被調用。我相信這個bug是在我的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); 
     } 
    } 
}