2012-10-19 14 views
6

मैं जावा स्विंग (नेटबीन्स) में एक जेपीसवर्डफ़िल्ल्ड के पृष्ठभूमि रंग बदलने की कोशिश कर रहा हूं।JPasswordField KeyPress स्ट्रिंग लंबाई त्रुटि?

यहाँ मैं क्या है:

private void pstxtPasswordKeyPressed(java.awt.event.KeyEvent evt) {           

    //Get string from password box 
    userPassword = new String(pstxtPassword.getPassword()); 

    //If password is 8+ characters 
    //(one less because string counting begins at 0) 
    if (userPassword.length() >= 7) { 

     //Set password input box background color to green 
     pstxtPassword.setBackground(Color.green); 
    } 

    else { //If password is less than 8 characters 

     //Set password input box background color to red 
     pstxtPassword.setBackground(Color.red); 
    } 

} 

सब कुछ काम करता है जब मैं बैकस्पेस को छोड़कर। जब मैं 8+ अक्षरों को टाइप करने के बाद बैकस्पेस करता हूं, तो रंग तब तक लाल रंग में नहीं बदल जाता जब तक कि फ़ील्ड में केवल 5 वर्ण शेष नहीं होते।

सहायता की सराहना की जाएगी, मैं जावा प्रोग्रामिंग और नेटबीन्स के लिए बहुत नया हूं।

संपादित करें: मैं अपने कोड बदल गए हैं,

//If password is 8+ characters 
    if ((pstxtPassword.getPassword()).length >= 8) { 

     //Set password input box background color to green 
     pstxtPassword.setBackground(Color.green); 
    } 

    else { //If password is less than 8 characters 

     //Set password input box background color to red 
     pstxtPassword.setBackground(Color.red); 
    } 

इस कोड मेरे लिए समझ बनाने के लिए लगता है, लेकिन परीक्षण में, रंग में परिवर्तन के 9 वीं चरित्र पर हरे रंग; बैकस्पेसिंग करते समय, यह 6 पर लाल रंग में बदल जाता है। ऐसा लगता है कि कोड >= 7 था जब रंग 8 वें चरित्र में हरा बदल गया, लेकिन 5 वर्णों पर लाल रंग में बदल गया।

After typing 9 characters, the component turns green

9 वर्ण लिखने के बाद, हरी घटक

After backspacing (starting from 9), component remains green until there are 6 characters

backspacing (9 से शुरू) के बाद, घटक हरी बनी हुई है बदल जाता है जब तक वहाँ 6 चरित्र

यह अजीब है , क्योंकि मेरे पास इस प्रोग्राम में एक बटन में समान कोड है जो एक त्रुटि संदेश प्रदर्शित करता है। वह कोड ठीक काम करता है। क्या यह एक कुंजीपटल समस्या है, शायद बैकस्पेस कुंजी के साथ कुछ करने के लिए?

उत्तर

8

एक के रूप में, सरणी बल्कि कि सरणी से निर्मित एक String की लंबाई से, getPassword() द्वारा वापस की लंबाई की जांच की जरूरत नहीं है। String एक सुरक्षा जोखिम है, क्योंकि यह आसानी से पाए गए नाम userPassword के साथ अनिश्चितकालीन समय के लिए संग्रहीत किया जाएगा।

परिशिष्ट: यहाँ रॉबिन के suggestionDocumentListener उपयोग करने के लिए की एक संबंधित example है। मुझे लगता है कि JPasswordField ने इसे संसाधित करने से पहले आपका मुख्य श्रोता KeyEvent देख रहा है।

+0

धन्यवाद, मैंने इसे बदल दिया है। – jessechk

+3

@Jaybob: यहां एक संबंधित [उदाहरण] (http://stackoverflow.com/a/5342146/230513) रॉबिन के बारे में यह सुनिश्चित करने के लिए 'userPassword' के मान को बाहर निकालें। 'DocumentListener' का उपयोग करने के लिए सुझाव। मुझे लगता है कि 'जेपीएसएसवर्डफ़िल्ल्ड' ने इसे संसाधित करने से पहले आपका मुख्य श्रोता 'कीइवेंट' देख रहा है। – trashgod

7
if (userPassword.length() >= 7) 

यह अगर बयान अपनी टिप्पणी से मेल नहीं खाता:

// अगर पासवर्ड 8+ है पात्रों

वास्तविक कोड का कहना है, अगर वहाँ 7+ चरित्र है, तो पृष्ठभूमि हरे हो जाते हैं। तो जब आप बैकस्पेसिंग कर रहे हों, तो जब आप 6 वर्णों तक नीचे हों तो पृष्ठभूमि को लाल रंग में बदलना चाहिए।

मुझे लगता है कि अपने भ्रम की स्थिति इस टिप्पणी में दिखाया गया है:

//(one less because string counting begins at 0) 

क्या आप का वर्णन करने के कोशिश कर रहे हैं कि अनुक्रमण0 पर एक String शुरू होता है में एक चरित्र, उदाहरण के लिए, जब आप charAt() या subString() का उपयोग करें। इसका मतलब है कि पहला अक्षर सूचकांक 0 पर है, दूसरा सूचकांक 1 आदि पर है। दूसरी ओर, length()String में वर्णों की संख्या देता है। यह अनुक्रमण के साथ कोई संबंध नहीं है है, इसलिए आप एक तरफ घटाना 1.

+0

ठीक है, तो 'लंबाई()' रिटर्न एक स्ट्रिंग में वर्णों की संख्या। मूल रूप से 'if (userPassword.length()> = 8' था। हालांकि, परीक्षण के बाद, जब मैंने 8 अक्षरों में टाइप किया था तब पृष्ठभूमि अभी भी लाल थी, जब मैंने 9वें चरित्र टाइप किया था, तो पृष्ठभूमि हरे रंग में बदल जाएगी। यह '> = 7' और यह किसी कारण से काम करता है। मैं अभी भी यह नहीं समझ सकता कि यह 5 वर्णों तक बैकस्पेस तक क्यों हरा रहता है। हालांकि आपकी मदद के लिए धन्यवाद। – jessechk

+0

@Jaybob इस कोड को डीबग करने के लिए, मैं प्रिंटिंग से शुरू करूंगा –

8

JPasswordFieldJTextComponent से विस्तारित है, तो आप DocumentListener को संलग्न कर सकते हैं जो सामग्री के प्रत्येक परिवर्तन पर पृष्ठभूमि रंग को अपडेट करने का एक बहुत सुरक्षित तरीका है।

+1

'दस्तावेज़ लिस्टनर' के लिए +1। – trashgod

0

मैं कुंजी दबाने के बजाय KeyRelease का उपयोग करके समस्या हल हो, इसे आज़माने मेरे दोस्त

0

उपयोग

private void pstxtPasswordKeyReleased(java.awt.event.KeyEvent evt) 

के बजाय

private void pstxtPasswordKeyPressed(java.awt.event.KeyEvent evt) 
संबंधित मुद्दे