मैं जावाएफएक्स में कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग जैसा कुछ हासिल करना चाहता था और मैंने सोचा था कि चूंकि जावाएफएक्स पहले से ही श्रोताओं और बाध्यताओं को गुणों के बीच समर्थन देता है, इसलिए यह काफी आसान होना चाहिए, इसलिए मैंने रूपांतरण के साथ बाइंडिंग के लिए छोटे ढांचे का निर्माण किया है, उदाहरण के लिए मैं अब इस तरह कुछ करने के लिए कर रहा हूँ (स्काला में उदाहरण है, लेकिन यह समझने के लिए मैं क्या मतलब संभव हो जाना चाहिए):जावाएफएक्स बल बाध्यकारी
val property1: Property[String]
val property2: Property[Path]
Bindings.Conversions
.bindUni(property1).to(property2)
.using(p => p.getFileName.toString)
.connect()
यहाँ मैं एक रूपांतरण समारोह के माध्यम से property2
का मूल्य (जो एक java.nio.file.Path
है) बाँध जो पथ का अंतिम भाग लेता है और एक स्ट्रिंग में property1
(जो स्ट्रिंग है) में परिवर्तित होता है।
इस के कार्यान्वयन वास्तव में सरल है (यहां तक कि द्विदिश बाइंडिंग के लिए, मैं बस, openjfx BidirectionalBinding
वर्ग से कुछ कोड ले लिया यह स्काला के अनुवाद और रूपांतरण के लिए यह अनुकूलित), और मुझे आश्चर्य है कि क्यों JavaFX में ऐसी कोई बात नहीं पहले से ही है ।
यह सब अच्छी तरह से काम करता है, और मैं भी इस तरह के बाइंडिंग की जटिल श्रृंखला बना सकता हूं। सब ठीक है जब तक कि रूपांतरण समारोह कुछ बाहरी राज्य पर निर्भर करता है।
मान लीजिए, उदाहरण के लिए, आप बाइंडिंग के निम्नलिखित श्रृंखला है:
Text field value -1-> intermediate java.nio.file.Path -2-> another String --> Label
जब पाठ क्षेत्र में परिवर्तन, Path
और String
स्वचालित रूप से पुनर्गणना की जाती है, और स्ट्रिंग संपत्ति के मूल्य लेबल करने के लिए लिखा है। सब अद्भुत है। लेकिन लगता है कि -2->
रूपांतरण कुछ चेकबॉक्स का टॉगल राज्य पर निर्भर होना चाहिए:
Checkbox state ---+
|
Text field value -1-> intermediate java.nio.file.Path -2-> another String --> Label
है यही कारण है कि, जब चेकबॉक्स चयनित है, परिवर्तन थोड़ा अलग होना चाहिए।
ऐसे निर्माण का प्रत्यक्ष कार्यान्वयन काम नहीं करेगा, जाहिर है, क्योंकि चेकबॉक्स स्थिति में परिवर्तन परिवर्तन श्रृंखला के पुनर्मूल्यांकन को टॉगल नहीं करता है। हालांकि, मैंने पाया कि जावाएफएक्स परिवर्तन घटनाओं को मजबूर करने के लिए कोई साधन नहीं प्रदान करता है। मैंने SimpleStringProperty
को ओवरराइड करने का प्रयास किया, उदाहरण के लिए, और इसकी fireValueChangedEvent()
विधि का खुलासा किया, लेकिन इससे मदद नहीं मिली। वर्तमान में मैं textField.setText(""); textField.setText(oldValue);
जैसे कुछ कर रहा हूं लेकिन यह बहुत बदसूरत है और स्पष्ट रूप से सही तरीका नहीं है।
क्या मुझे कुछ याद आ रहा है, और वास्तव में ऐसा करना संभव है जो मैं करना चाहता हूं, या ऐसी कोई चीज़ नहीं है और मैं यहां पूरी तरह से खराब हूं?
यदि उत्तर नहीं है, तो मुझे लगता है कि यह पूरी ढांचे की गंभीरता से नुकसान को व्यक्त करता है। मैं समझता हूं कि मैं वास्तव में ऐसा कर सकता हूं जो मैं कई श्रोताओं के साथ करना चाहता हूं, लेकिन यह बदसूरत होगा, और मैं पूरी चीज को यथासंभव सामान्य बनाना चाहता हूं।
यह कुछ ऐसा है जो मैंने पाया, और अब मैं इसी तरह के दृष्टिकोण (निम्न-स्तरीय बाइंडिंग के माध्यम से) का उपयोग कर रहा हूं। हालांकि, यह दृष्टिकोण रूपांतरण के साथ बिडरेक्शनल बाइंडिंग के लिए अच्छी तरह से विस्तार नहीं करना प्रतीत होता है। यह मेरे उपयोग के मामले में कोई समस्या नहीं है, लेकिन फिर भी मुझे लगता है कि यह * ढांचे के लिए एक समस्या है। मैं आपका जवाब स्वीकार करूंगा, क्योंकि यह अनिवार्य रूप से मैं अब उपयोग कर रहा हूं। धन्यवाद। –
आपका मामला हल हो गया है। ढांचे की समस्या के बारे में मैं javafx-jira.kenai.com पर एक समस्या दर्ज करने की सलाह दूंगा और/या [email protected] पर एक मेल लिखूंगा - आप सीधे डेवलपर्स के संपर्क में रहेंगे। –