2012-12-07 9 views
7

Gibt es eine Methode, die BooleanProperty an die Verknüpfung aller Elemente in ObservableList bindet?JavaFX - bind -Eigenschaft an die Eigenschaften jedes Elements in observable Collection

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

Gibt es ein solches Verfahren wie:

static BooleanBinding conjunction(ObservableList<BooleanProperty> op) 

Antwort

5

Es gibt kein conjunction api in der 2.2-Plattform JavaFX definiert.

Sie könnten ein ConjunctionBooleanBinding (aka AllTrueBinding) durch Unterklassen BooleanBinding erstellen.

Akzeptieren Sie die ObservableList im Konstruktor Ihrer neuen Klasse, und verwenden Sie die low level binding api in einer außer Kraft gesetzt computeValue Methode der Bindungswert auf logisch Basis zu setzen alle der Boolesche Werte in der Liste Anding zusammen.

Hier ist eine Beispielimplementierung. Die Stichprobe könnte weiter leistungsoptimiert sein und WeakReferences nutzen, so dass keine manuelle Disposition erforderlich ist.

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

Und hier ist ein Test-Harnisch zu zeigen, wie es funktioniert:

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

Danke, ich Ihren Rat verwendet. – dpelisek

4

Sie können die Methode leicht implementieren wie folgt:

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; 
} 
Verwandte Themen