2011-01-26 11 views
6

मैं विधि है कि वास्तव में JPassword क्षेत्र renders खोजने की कोशिश कर रहा हूँ। शायद प्रस्तुत करना सही शब्द नहीं है, इसलिए यहां सौदा है:जावा जेपीएस्वर्ड फ़ील्ड प्रस्तुत करना?

मैं जेपीएसएसवर्ड फ़ील्ड को उसी वास्तविक लंबाई के बजाय वर्णों की एक अलग संख्या दिखाने की कोशिश कर रहा हूं, जो वास्तविक पासवर्ड मैं टाइप कर रहा हूं। उदाहरण के लिए, अगर मैं पासवर्ड और setEchoChar ((चरित्र) मूल्य) के लिए 123456 टाइप करने के लिए "#"

पासवर्ड इस तरह दिखाई देगा: # # # # # #
मैं एक उत्पन्न करने में सक्षम होना चाहता हूँ सितारों के यादृच्छिक संख्या को दिखाने के लिए: # # # # # # # # # #
यदि संख्या उदाहरण के लिए 10 था। (पाठ्यक्रम की जगहों के बिना)

मैं परिवर्तनों का पता लगाने के लिए केवल दो श्रोताओं को जोड़कर इसे करने में सक्षम था, फिर पाठ लेता हूं और इसे एक मुखौटा के साथ प्रतिस्थापित करता हूं जिसे मैं बनाता हूं, लेकिन यह संतुष्ट नहीं होता है, मैं बनना चाहता हूं वास्तविक वस्तु के व्यवहार को बदलने में सक्षम। एक छोटी चुनौती चोट नहीं पहुंचीगी, है ना? :) मैं किसी भी सुझाव के लिए तैयार हूं। धन्यवाद।

उत्तर

0

मैं इस बारे में वास्तव में यकीन नहीं है, लेकिन शायद एक कस्टम Highlighter यह पूरा कर सकते हैं?

passwordField.setHighlighter(new MySpecialPasswordHighlighter()); 
1

मुझे लगता है कि मुझे "सही" समाधान का कोई तरीका मिला है, हालांकि मैंने इसे अभी लागू करने का प्रबंधन नहीं किया है।

गूंज चरित्र PasswordView.drawEchoCharacter से डूब जाता है(): यहाँ सुझाव दिए गए हैं। यह संरक्षित विधि है। इसे ओवरराइड किया जा सकता है, ताकि आप जितना चाहें उतने पात्र आकर्षित कर सकें। PasswordView की उदाहरण BasicPassworFieldUI.create (तत्व) द्वारा बनाई गई है। BasicPassworFieldUI का उदाहरण JComponent.setUI() द्वारा असाइन किया गया है।

तो, जिस तरह से मेरा सुझाव होता है:

  1. लागू MyPasswordView फैली PasswordView और drawEchoCharacter()
  2. लागू MyPasswordUI BasicPasswordFieldUI ओवरराइड करता है कि देखें बनाने फैली (तत्व ELEM ओवरराइड करता है) और MyPasswordView का उदाहरण बनाता है।
  3. अवहेलना setUI() JPasswordField की और उनके MyPasswordUI निर्धारित किया है।

मैं यह सब लागू किया लेकिन यह अभी भी हालांकि मेरी पद्धतियों को बुलाया जाता काम नहीं करता। मेरा मानना ​​है कि बग मेरे drawEchoCharacter() के बदले मूल्य में है। यह 2:00 है और मैं बग को ठीक नहीं होगा लेकिन मेरा मानना ​​है कि आप कर सकते हैं।

मैं तुम्हें अच्छी किस्मत चाहते हैं और पता है कि तुम इसे ठीक करने के सफल खुश हो जाएगा।

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

यहाँ मेरी कोड है

संबंधित मुद्दे