2012-10-21 13 views
7

मेरे स्विंग एप्लिकेशन में, उपयोगकर्ता को अगली विंडो पर स्विच करने से पहले संख्याएं और मान डालना होगा। अब एक स्वच्छ कार्यक्रम के रूप में, यदि यह मान्य है या नहीं, तो मैं प्रत्येक इनपुट की जांच करता हूं, और यदि नहीं, तो एक त्रुटि संदेश प्रदर्शित होता है और अगली विंडो नहीं खुलती है।जावा स्विंग: इनपुट मानों की वैधता जांच लागू करना

इस चेक की संरचना (उदाहरण) निम्नलिखित है:

Button buttonToOpenNextWindow = new JButton("next"); 
button.addActionListener(new ActionListener(){ 

    public void actionPerformed(ActionEvent e){ 
     if(checkValidty){ 
      // (...) 
      new WindowA(); 
      frame.dispose(); // (*) 
     } 
    } 
}); 

(*) नोट: मुझे पता है कि कई JFrames के सिद्धांत बदसूरत है, और मैं पर हूँ कि बदलने के लिए, लेकिन इस सवाल के लिए यह अप्रासंगिक है।

अब इस सवाल का ध्यान इस checkValidity() है, जो मैं इस तरह से संरचित है:

private boolean checkValidity(){ 

    // check input 1 
    try{ 
     Integer.parseInt(textField1.getText()); 
    }catch (NumberFormatException e){ 
     new ErrorDialog("input 1 is invalid!"); // own implemented dialog 
     return false; 
    } 

    // check input 2 
    try{ 
     Integer.parseInt(textField2.getText()); 
    }catch (NumberFormatException e){ 
     new ErrorDialog("input 2 is invalid!"); // own implemented dialog 
     return false; 
    } 

    // (...) 

    // check input n 
    try{ 
     Integer.parseInt(textField_n.getText()); 
    }catch (NumberFormatException e){ 
     new ErrorDialog("input n is invalid!"); // own implemented dialog 
     return false; 
    } 
    return true; 
} 

यह ठीक काम करता है के रूप में मैं चाहता हूँ, लेकिन क्योंकि कई इनपुट विकल्प होने विधि हो जाता है कोड में ही बहुत बदसूरत है, 200, 300 या अधिक लाइनें लंबी हैं (क्योंकि मैं न केवल यह जांचता हूं कि यह एक संख्या है, लेकिन अगर यह प्रोग्राम प्रोग्राम तर्क के संदर्भ में समझ में आता है)। क्या ऐसी चीजों की जांच करने के लिए एक स्विंग-डाउन विधि है? या किसी को भी बेहतर विचार है कि विभाजन विधियों के साथ वास्तव में इस कार्यक्षमता को कैसे महसूस किया जाए?

उत्तर

15

एक समाधान स्विंग के InputVerifier का उपयोग प्रत्येक JTextField के लिए इनपुट को प्रमाणित करने के लिए करना होगा। सत्यापन कार्यक्षमता प्रत्येक क्षेत्र के लिए एक ही है, एक उदाहरण सभी घटकों के लिए इस्तेमाल किया जा सकता:

public class MyNumericVerifier extends InputVerifier { 
    @Override 
    public boolean verify(JComponent input) { 
     String text = ((JTextField) input).getText(); 
     try { 
      Integer.parseInt(text); 
     } catch (NumberFormatException e) { 
      return false; 
     } 

     return true; 
    } 
} 

InputVerifier verifier = new MyNumericVerifier() 
textField1.setInputVerifier(verifier); 
+0

+1 उपयोग करने के लिए अच्छी विधि :) –

2

ऐसी कई चीजें हैं जो आप कर सकते हैं। एक सरल तरीका यह है कि एक विधि है जो int में पारगम्यता के लिए तारों की एक सूची की जांच करे। अतिरिक्त चेक के लिए आपके पास और अधिक विधियां होंगी जो कुछ सामान्य चीज़ों की जांच करती हैं, जैसे संख्या सीमा। इसलिए प्रत्येक प्रकार की जांच को अपनी विधि में विभाजित करें और आवश्यकतानुसार लिखें।

अन्यथा इस तरह की चीज़ को संभालने वाले पूर्ण सत्यापन ढांचे हैं। वे आसानी से googlable हैं, मैं कहूंगा।

6

मैं JFormattedTextField के एक उन्नत संस्करण का उपयोग करना पसंद। सुधार से मेरा मतलब बेहतर देखभाल व्यवहार, तत्काल उपयोगकर्ता प्रतिक्रिया प्रदान करने के लिए प्रत्येक परिवर्तन पर सत्यापन (जैसे इनपुट अमान्य होने पर पृष्ठभूमि रंग बदलें) ...। वह उस बटन के साथ संयुक्त होता है जो इनपुट अक्षम होने तक अक्षम होता है।

पर "बटन क्लिक करें और त्रुटि संदेश प्रकट होते देखना" मुख्य लाभ:

  • उपयोगकर्ता है.अगर वेब अनुप्रयोगों सर्वर के लिए एक राउंड ट्रिप से बचने और तत्काल प्रतिक्रिया के लिए जावास्क्रिप्ट का उपयोग कर सकते के लिए त्वरित प्रतिक्रिया , डेस्कटॉप अनुप्रयोगों में ऐसा नहीं होने का कोई बहाना नहीं है। मान्य करने के लिए एक बटन दबाकर इतना '90 है।
  • दृश्य प्रतिक्रिया महत्वपूर्ण है, और बेहतर InputVerifier जो बेहतर फोकस
  • अत्यधिक पुन: प्रयोज्य घटक से बचाता है। बस सुनिश्चित करें कि आपके 'यूटिलिटी कोड पैक' में Format एस (दिनांक, युगल, पूर्णांक, श्रेणियां, ... के लिए) का एक गुच्छा शामिल है और Format एस के उपयोग के कारण आप लगभग किसी भी स्थिति
  • को प्रबंधित कर सकते हैं, इसके लिए आसान समायोज्य अलग Locale एस
  • आपको JFormattedTextField के बाद इनपुट को पार्स करने की आवश्यकता नहीं है।सभी पार्सिंग कोड प्रारूप में निहित है, और आप बस JFormattedTextField#getValue
  • का उपयोग कर सकते हैं सभी सत्यापन JFormattedTextField द्वारा ख्याल रखा जाता है। तुम्हें पता है कि मूल्य आप getValue का उपयोग कर पुनः प्राप्त एक वैध एक
+1

+1 को यह नहीं कहना चाहिए कि कोई भी 'इनपुटवियरिफायर' शीर्ष पर जा सकता है :) पूरी तरह से 'JFormattedTextField' को भूल रहा है –

1

है आप प्रयोग के माध्यम से वास्तविक समय मान्यता प्राप्त कर सकते हैं एक DocumentFilter

आप कुछ उदाहरण के लिए this और this की जाँच करें।

मुझे लगता है कि, आपको लगता है कि JFormattedTextField इस मामले में अधिक उपयुक्त समाधान है।

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