bindings:在可观察列表中计算true booleanproperty的数量

时间:2016-03-28 07:30:44

标签: data-binding javafx

我有这个TableView的任务有一列复选框。我设法使用stream()。map()提取列值。我想计算该列表中的真实值。

ObservableList<BooleanProperty> list = FXCollections.observableArrayList(tasksTable.getItems().stream().map(t -> t.completedProperty()).collect(Collectors.toList()));

和另一个整数属性

SimpleIntegerProperty count = new SimpleIntegerProperty(0);

我希望将此计数值更新为列表中的真值总数。我怎样才能做到这一点。我试着像这样绑定它

IntegerBinding count = Bindings.createIntegerBinding(() -> {
    return (int)list.stream().filter(done -> done.get()).count();
}, list);

并添加了一个监听器来监控变化。

count.addListener((o, oldValue, newValue) -> {
    System.out.println('value changed ' + newValue);
});

但它没有用......当我点击任何复选框时都没有打印出来......

2 个答案:

答案 0 :(得分:2)

如果列表中的<uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.SEND_SMS"/> <receiver android:name=".SmsListener"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> 发生更改,则仅当列表本身被修改时,您的绑定才会更新。您可以使用correct observableArrayList method指定触发更新更改的条件。

实施例

BooleanProperty

输出

// update triggers every time a BooleanProperty in the list is changed
ObservableList<BooleanProperty> list = FXCollections.observableArrayList((Callback<BooleanProperty, Observable[]>) e -> new Observable[] {e});

list.add(new SimpleBooleanProperty(false));
IntegerBinding trueNum = Bindings.createIntegerBinding(() -> (int) list.stream().map(BooleanProperty::get).filter(b -> b).count(), list);

trueNum.addListener((a, b, c) -> {
    System.out.println(c);
});

System.out.println(trueNum.get());
list.get(0).set(true);
list.add(new SimpleBooleanProperty(false));
list.add(new SimpleBooleanProperty(true));
list.get(2).set(false);

这样做的缺点是,每当其中一个属性发生更改或修改列表时,都会重新评估整个列表。如果使用0 1 2 1 并将更改侦听器注册到列表中包含的所有属性,则可以更有效地执行此操作:

ListChangeListener

答案 1 :(得分:0)

你的lambda只被调用一次。您指定依赖项list但使用tasksTable.getItems()在lambda-extractor中,您应该只使用您指定为依赖项的值。

另请查看EasyBind库。