2012-12-07 21 views
7

क्या कोई तरीका मौजूद है जो बूलियनप्रोपर्टी को ऑब्जर्जेबललिस्ट में प्रत्येक तत्व के संयोजन के साथ बांधता है?जावाएफएक्स - अवलोकन संग्रह में प्रत्येक तत्व के गुणों के लिए संपत्ति को बांधें

static BooleanBinding conjunction(ObservableList<BooleanProperty> op) 

उत्तर

5

कोई conjunction एपीआई JavaFX 2.2 मंच में परिभाषित किया गया है:

ObservableList<BooleanProperty> list; 
list = FXCollections.observableList(new ArrayList<BooleanProperty>)); 
BooleanProperty emptyProperty = new SimpleBooleanProperty(); 
emptyProperty.bind(Bindings.conunction(list));` 

वहाँ के रूप में इस तरह के एक विधि है।

BooleanBinding उप-वर्गीकरण करके आप ConjunctionBooleanBinding (उर्फ AllTrueBinding) बना सकते हैं।

अपने नए वर्ग के निर्माता में ObservableList स्वीकार करें, और एक अधिरोहित computeValue विधि में low level binding api का उपयोग पर आधारित तार्किक एक साथ सूची में बूलियन मूल्यों के सभी Anding बाध्यकारी मान सेट करने के।

यहां एक नमूना कार्यान्वयन है। नमूना आगे के प्रदर्शन को अनुकूलित किया जा सकता है और वीक संदर्भों का उपयोग कर सकता है, इसलिए इसे मैन्युअल स्वभाव की आवश्यकता नहीं है।

import java.util.*; 
import javafx.beans.property.*; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 

public class ListBindingTest { 
    final BooleanProperty a = new SimpleBooleanProperty(true); 
    final BooleanProperty b = new SimpleBooleanProperty(true); 
    final BooleanProperty c = new SimpleBooleanProperty(true); 
    final BooleanProperty d = new SimpleBooleanProperty(true); 
    final ObservableList<BooleanProperty> booleanList = 
    FXCollections.observableArrayList(a, b, c, d); 

    public static void main(String[] args) { 
    new ListBindingTest().test(); 
    } 

    private void test() { 
    AllTrueBinding at = new AllTrueBinding(booleanList); 

    System.out.println(at.get() + forArrayString(booleanList)); 

    b.set(false); 
    System.out.println(at.get() + forArrayString(booleanList)); 

    b.set(true); 
    System.out.println(at.get() + forArrayString(booleanList)); 

    booleanList.add(new SimpleBooleanProperty(false)); 
    System.out.println(at.get() + forArrayString(booleanList)); 

    booleanList.remove(3, 5); 
    System.out.println(at.get() + forArrayString(booleanList)); 

    at.dispose(); 
    } 

    private String forArrayString(List list) { 
    return " for " + Arrays.toString(list.toArray()); 
    } 
} 
+0

धन्यवाद, मैं आपकी सलाह के लिए इस्तेमाल किया

import javafx.beans.binding.BooleanBinding; import javafx.beans.property.BooleanProperty; import javafx.collections.*; public class AllTrueBinding extends BooleanBinding { private final ObservableList<BooleanProperty> boundList; private final ListChangeListener<BooleanProperty> BOUND_LIST_CHANGE_LISTENER = new ListChangeListener<BooleanProperty>() { @Override public void onChanged( ListChangeListener.Change<? extends BooleanProperty> change ) { refreshBinding(); } }; private BooleanProperty[] observedProperties = {}; AllTrueBinding(ObservableList<BooleanProperty> booleanList) { booleanList.addListener(BOUND_LIST_CHANGE_LISTENER); boundList = booleanList; refreshBinding(); } @Override protected boolean computeValue() { for (BooleanProperty bp: observedProperties) { if (!bp.get()) { return false; } } return true; } @Override public void dispose() { boundList.removeListener(BOUND_LIST_CHANGE_LISTENER); super.dispose(); } private void refreshBinding() { super.unbind(observedProperties); observedProperties = boundList.toArray(new BooleanProperty[0]); super.bind(observedProperties); this.invalidate(); } } 

और यहाँ प्रदर्शित करने के लिए यह कैसे काम करता एक परीक्षण दोहन है। – dpelisek

4

आप आसानी से विधि इस प्रकार लागू कर सकते हैं:

public static BooleanBinding conjunction(ObservableList<BooleanProperty> list){ 
    BooleanBinding and = new SimpleBooleanProperty(true).and(list.get(0)); 
    for(int i = 1; i < list.size(); i++){ 
    and = and.and(list.get(i)); 
    } 
    return and; 
}