我有这个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);
});
但它没有用......当我点击任何复选框时都没有打印出来......
答案 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库。