2013-06-11 8 views
5

मैं जावाएफएक्स में कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग जैसा कुछ हासिल करना चाहता था और मैंने सोचा था कि चूंकि जावाएफएक्स पहले से ही श्रोताओं और बाध्यताओं को गुणों के बीच समर्थन देता है, इसलिए यह काफी आसान होना चाहिए, इसलिए मैंने रूपांतरण के साथ बाइंडिंग के लिए छोटे ढांचे का निर्माण किया है, उदाहरण के लिए मैं अब इस तरह कुछ करने के लिए कर रहा हूँ (स्काला में उदाहरण है, लेकिन यह समझने के लिए मैं क्या मतलब संभव हो जाना चाहिए):जावाएफएक्स बल बाध्यकारी

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); जैसे कुछ कर रहा हूं लेकिन यह बहुत बदसूरत है और स्पष्ट रूप से सही तरीका नहीं है।

क्या मुझे कुछ याद आ रहा है, और वास्तव में ऐसा करना संभव है जो मैं करना चाहता हूं, या ऐसी कोई चीज़ नहीं है और मैं यहां पूरी तरह से खराब हूं?

यदि उत्तर नहीं है, तो मुझे लगता है कि यह पूरी ढांचे की गंभीरता से नुकसान को व्यक्त करता है। मैं समझता हूं कि मैं वास्तव में ऐसा कर सकता हूं जो मैं कई श्रोताओं के साथ करना चाहता हूं, लेकिन यह बदसूरत होगा, और मैं पूरी चीज को यथासंभव सामान्य बनाना चाहता हूं।

उत्तर

1

आप CheckBox#selectedProperty() को उसी तरह सुन सकते हैं जैसे आप स्ट्रिंग गुणों को सुनते हैं। अगला उदाहरण देखें:

public class ConditionalBind extends Application { 

    Label label = new Label(); 
    TextField tf = new TextField("hi"); 
    CheckBox cb = new CheckBox("lowerize"); 

    @Override 
    public void start(Stage primaryStage) { 

     label.textProperty().bind(new StringBinding() { 

      { 
       bind(tf.textProperty(), cb.selectedProperty()); 
      } 

      @Override 
      protected String computeValue() { 
       return cb.isSelected() ? tf.getText().toLowerCase() : tf.getText(); 
      } 
     }); 

     VBox root = new VBox(10); 
     root.getChildren().addAll(label, cb, tf); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

यह कुछ ऐसा है जो मैंने पाया, और अब मैं इसी तरह के दृष्टिकोण (निम्न-स्तरीय बाइंडिंग के माध्यम से) का उपयोग कर रहा हूं। हालांकि, यह दृष्टिकोण रूपांतरण के साथ बिडरेक्शनल बाइंडिंग के लिए अच्छी तरह से विस्तार नहीं करना प्रतीत होता है। यह मेरे उपयोग के मामले में कोई समस्या नहीं है, लेकिन फिर भी मुझे लगता है कि यह * ढांचे के लिए एक समस्या है। मैं आपका जवाब स्वीकार करूंगा, क्योंकि यह अनिवार्य रूप से मैं अब उपयोग कर रहा हूं। धन्यवाद। –

+0

आपका मामला हल हो गया है। ढांचे की समस्या के बारे में मैं javafx-jira.kenai.com पर एक समस्या दर्ज करने की सलाह दूंगा और/या [email protected] पर एक मेल लिखूंगा - आप सीधे डेवलपर्स के संपर्क में रहेंगे। –

0

"बदसूरत" वर्कअराउंड के रूप में मैंने अर्थ को बदलने के बिना मूल्यों को यादृच्छिक रूप से बदल दिया। जैसे एक डबल वैल्यू के लिए मैं एक बदलाव को मजबूर करने के लिए या स्ट्रिंग वैल्यू के लिए छोटी यादृच्छिक राशि के रूप में जोड़ता हूं, मैं टॉगल और अदृश्य स्थान चाहता हूं। यह सब अच्छा नहीं है लेकिन शुरुआत के लिए संपत्ति परिवर्तन को ट्रिगर करने का असर होगा।

चीजें एक बहुप्रचारित वातावरण में बदतर हो जाती हैं।वहां ऐसा हो सकता है कि बाध्यकारी संपत्ति को ट्रिगर नहीं मिलेगा यदि बाध्यकारी संपत्ति की प्रारंभिक सेटिंग के ठीक बाद थोड़ा सा होता है। यदि अब आप संपत्ति को उसी मान पर सेट करते हैं तो मान को बदले में नहीं माना जाएगा और बाध्य संपत्ति प्रारंभिक मान नहीं लेगी लेकिन शून्य या डिफ़ॉल्ट मान पर रहेगी। बहुत बदसूरत!

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