2015-07-22 10 views
5

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

saveBtn.disableProperty().bind(Bindings.when(
      departureHourText.textProperty().isNotEqualTo("") 
        .and(isNumber(departureHourText.getText()))) 
      .then(false) 
      .otherwise(true)); 

यहाँ मेरी isNumber विधि है:

private BooleanProperty isNumber(String string) { 
    return new SimpleBooleanProperty(string.matches("[0-9]+")); 
} 

लेकिन बटन कोई बात नहीं क्या मैं TextField में टाइप अक्षम किया जा रहा रखना है।

किसी भी मदद की बहुत सराहना की जाती है।

अद्यतन

जब मैं इस अभिव्यक्ति का मूल्यांकन: departureHourText.textProperty().isNotEqualTo("") परिणाम होगा: BooleanBinding [invalid]

उत्तर

10

आपका अभिव्यक्ति थोड़ा बंद है।

के अपने तर्कसंगत कथन के दोनों भागों का परीक्षण करने की कोशिश करते हैं:

saveBtn.disableProperty().bind(Bindings.when(
     departureHourText.textProperty().isNotEqualTo("")) 
     .then(false) 
     .otherwise(true)); 

ऊपर कोड सही ढंग से काम करता है। जब आप टेक्स्ट बॉक्स में स्ट्रिंग जोड़ते हैं, तो आपको एक बटन टॉगल ईवेंट मिल जाएगा।

saveBtn.disableProperty().bind(Bindings.when(
     isNumber(departureHourText.getText())) 
     .then(false) 
     .otherwise(true)); 

उपर्युक्त कोड इसे बनाता है ताकि बटन हमेशा अक्षम के रूप में फंस जाए। आइए जांच करें क्यों।

की विधि ISNUMBER() में एक प्रिंट बयान जोड़ें:

private BooleanProperty isNumber(String string) { 
System.out.println("This was called"); 
return new SimpleBooleanProperty(string.matches("[0-9]+")); 
} 

अगर हम जब इस निष्पादित किया जाता है जब हम टाइप करना आरंभ करें को देखें, हम पाते हैं कि यह केवल कहा जाता है जब हम शुरू में बाध्यकारी घोषित! ऐसा इसलिए है क्योंकि आपकी विधि को कब नहीं जाना जाता है, इसलिए बाध्यकारी केवल इसे प्रारंभ में देखता है, जब यह गलत होता है क्योंकि फ़ील्ड में कोई संख्या नहीं होती है।

हमें क्या करना है एक तरीका ढूंढना है ताकि जब हमारी टेक्स्ट प्रॉपर्टी अपडेट हो जाए, तो यह राज्यों को बदलना जानता है। यदि हम एक उदाहरण के रूप में हमारे isNotEqualTo() को देखते हैं, तो हम पाते हैं कि हम शायद किसी भी तरह से एक नया बूलियन बाइंडिंग करने के लिए एक रास्ता तलाशना चाहते हैं।

अब, मुझे एक फ़ंक्शन मिला और मैंने एक जिथब लिंक (https://gist.github.com/james-d/9904574) से संशोधित किया। लिंक इंगित करता है कि हम रेगेक्स पैटर्न से एक नया बूलियन बाइंडिंग कैसे बना सकते हैं।

सबसे पहले, के लिए एक नया पैटर्न बनाते हैं:

Pattern numbers = Pattern.compile("[0-9]+"); 

तब बंधन समारोह बनाने के लिए:

BooleanBinding patternTextAreaBinding(TextArea textArea, Pattern pattern) { 
BooleanBinding binding = Bindings.createBooleanBinding(() -> 
    pattern.matcher(textArea.getText()).matches(), textArea.textProperty()); 
return binding ; 
} 

तो उस के साथ हम अब आप क्या करना चाहता था कर सकते हैं! हम आपके पिछले पैटर्न को अपने नए पैटर्न के लिए बदलते हैं टेक्स्टएरिया बाइंडिंग (टेक्स्टएरिया टेक्स्ट एरिया, पैटर्न पैटर्न) फ़ंक्शन और हमारे दो मानों में पास करते हैं, टेक्स्ट एरिया जिसे आप ट्रैक रखना चाहते हैं और जिस पैटर्न को आप पालन करना चाहते हैं (मैंने संख्याओं के ऊपर पैटर्न को बुलाया)।

saveBtn.disableProperty().bind(Bindings.when(
     departureHourText.textProperty().isNotEqualTo("") 
       .and(patternTextAreaBinding(departureHourText,numbers))) 
     .then(false) 
     .otherwise(true)); 

आशा है कि मदद करता है!

0

मुझे आश्चर्य है कि अभिव्यक्ति when के बिना लिखी जा सकती है? .bind(departureHourText.textProperty().isNotEqualTo("").and(patternTextAreaBinding(departureHourText,numbers))).not())

: If (x) then false else true;

सिर्फ बजाय .not() का उपयोग करने के रूप में एक विकल्प हो सकता है निरर्थक प्रतीत हो रहा है और हो सकता है not (x) का उपयोग कर सरल किया जा सकता है ...

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