2012-12-07 21 views

cevap

5

JavaFX 2.2 platformu tanımlanmış conjunction API vardır:

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

böyle bir yöntem olarak var.

BooleanBinding alt sınıflarına göre ConjunctionBooleanBinding (aka AllTrueBinding) oluşturabilirsiniz.

yeni sınıfın yapıcı içinde ObservableList kabul edin ve mantıksal olarak bir araya listedeki boole tüm değerleri Anding dayalı bağlanma değerini ayarlamak için bir geçersiz kılınmış computeValue yöntemde low level binding api kullanın.

İşte örnek bir uygulama. Örnek, daha iyi performans için optimize edilmiş olabilir ve WeakReferences'dan faydalanabilir, bu yüzden manuel yerleştirme gerektirmez. aşağıdaki gibi

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

sayesinde Tavsiyene kullanılan buraya

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(); } } 

Ve

nasıl çalıştığını göstermek için bir test koşum olduğunu. – dpelisek

4

Kolayca yöntemini uygulayabilirsiniz:

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; 
} 
İlgili konular