Data binding 绑定:计算可观察列表中true booleanproperty的数量
我有一个任务表视图,其中有一列复选框。我已经设法使用stream().map()提取了列值。我想计算列表中的真实值Data binding 绑定:计算可观察列表中true booleanproperty的数量,data-binding,javafx,Data Binding,Javafx,我有一个任务表视图,其中有一列复选框。我已经设法使用stream().map()提取了列值。我想计算列表中的真实值 ObservableList<BooleanProperty> list = FXCollections.observableArrayList(tasksTable.getItems().stream().map(t -> t.completedProperty()).collect(Collectors.toList())); 我希望将此计数值更新为列表中的
ObservableList<BooleanProperty> list = FXCollections.observableArrayList(tasksTable.getItems().stream().map(t -> t.completedProperty()).collect(Collectors.toList()));
我希望将此计数值更新为列表中的真值总数。我怎样才能做到这一点。我试着像这样装订
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);
});
但它不起作用。。。当我单击任何复选框时,都不会打印任何内容…您的lambda只被调用一次。您可以指定依赖项
列表
,但在lambda提取器中使用tasksTable.getItems()
,您应该只使用指定为依赖项的值
还可以查看库。您的lambda只被调用一次。您可以指定依赖项
列表
,但在lambda提取器中使用tasksTable.getItems()
,您应该只使用指定为依赖项的值
还可以查看库。如果列表中的
布尔属性发生更改,则仅当列表本身被修改时,绑定才会更新。可以使用指定触发更新更改的条件
例子
这样做的缺点是,每次更改一个属性或修改列表时,都会重新评估整个列表。如果使用ListChangeListener
并将更改侦听器注册到列表中包含的所有属性,则可以更有效地执行此操作:
ObservableList<BooleanProperty> list = FXCollections.observableArrayList();
...
SimpleIntegerProperty count = new SimpleIntegerProperty();
ChangeListener<Boolean> changeListener = (observable, oldValue, newValue) -> {
// increment or decrement if value was changed to true or false respecively
count.set(count.get()+ (newValue ? 1 : -1));
};
// get initial value and register change listeners to elements of list
int currentCount = 0;
for (BooleanProperty p : list) {
if (p.get()) {
currentCount++;
}
p.addListener(changeListener);
}
count.set(currentCount);
list.addListener((ListChangeListener.Change<? extends BooleanProperty> c) -> {
int modification = 0;
while (c.next()) {
// remove listeners from all properties removed in change
// and calculate update of value
for (BooleanProperty p : c.getRemoved()) {
p.removeListener(changeListener);
if (p.getValue()) {
modification--;
}
}
// add listeners from all properties added in change
// and calculate update of value
for (BooleanProperty p : c.getAddedSubList()) {
p.addListener(changeListener);
if (p.getValue()) {
modification++;
}
}
}
// update count
count.set(count.get()+modification);
});
observeList=FXCollections.observearraylist();
...
SimpleIntegerProperty计数=新的SimpleIntegerProperty();
ChangeListener ChangeListener=(可观察、旧值、新值)->{
//如果值分别更改为true或false,则递增或递减
set(count.get()+(newValue?1:-1));
};
//获取初始值并将更改侦听器注册到列表的元素
int currentCount=0;
for(布尔属性p:list){
if(p.get()){
currentCount++;
}
p、 addListener(changeListener);
}
count.set(当前计数);
list.addListener((ListChangeListener.Change如果列表中的BooleanProperty
s发生更改,则仅当列表本身被修改时,绑定才会更新。您可以使用指定触发更新更改的条件
例子
这样做的缺点是,每次更改一个属性或修改列表时,都会重新评估整个列表。如果使用ListChangeListener
并将更改侦听器注册到列表中包含的所有属性,则可以更有效地执行此操作:
ObservableList<BooleanProperty> list = FXCollections.observableArrayList();
...
SimpleIntegerProperty count = new SimpleIntegerProperty();
ChangeListener<Boolean> changeListener = (observable, oldValue, newValue) -> {
// increment or decrement if value was changed to true or false respecively
count.set(count.get()+ (newValue ? 1 : -1));
};
// get initial value and register change listeners to elements of list
int currentCount = 0;
for (BooleanProperty p : list) {
if (p.get()) {
currentCount++;
}
p.addListener(changeListener);
}
count.set(currentCount);
list.addListener((ListChangeListener.Change<? extends BooleanProperty> c) -> {
int modification = 0;
while (c.next()) {
// remove listeners from all properties removed in change
// and calculate update of value
for (BooleanProperty p : c.getRemoved()) {
p.removeListener(changeListener);
if (p.getValue()) {
modification--;
}
}
// add listeners from all properties added in change
// and calculate update of value
for (BooleanProperty p : c.getAddedSubList()) {
p.addListener(changeListener);
if (p.getValue()) {
modification++;
}
}
}
// update count
count.set(count.get()+modification);
});
observeList=FXCollections.observearraylist();
...
SimpleIntegerProperty计数=新的SimpleIntegerProperty();
ChangeListener ChangeListener=(可观察、旧值、新值)->{
//如果值分别更改为true或false,则递增或递减
set(count.get()+(newValue?1:-1));
};
//获取初始值并将更改侦听器注册到列表的元素
int currentCount=0;
for(布尔属性p:list){
if(p.get()){
currentCount++;
}
p、 addListener(changeListener);
}
count.set(当前计数);
list.addListener((ListChangeListener.Change
0
1
2
1
ObservableList<BooleanProperty> list = FXCollections.observableArrayList();
...
SimpleIntegerProperty count = new SimpleIntegerProperty();
ChangeListener<Boolean> changeListener = (observable, oldValue, newValue) -> {
// increment or decrement if value was changed to true or false respecively
count.set(count.get()+ (newValue ? 1 : -1));
};
// get initial value and register change listeners to elements of list
int currentCount = 0;
for (BooleanProperty p : list) {
if (p.get()) {
currentCount++;
}
p.addListener(changeListener);
}
count.set(currentCount);
list.addListener((ListChangeListener.Change<? extends BooleanProperty> c) -> {
int modification = 0;
while (c.next()) {
// remove listeners from all properties removed in change
// and calculate update of value
for (BooleanProperty p : c.getRemoved()) {
p.removeListener(changeListener);
if (p.getValue()) {
modification--;
}
}
// add listeners from all properties added in change
// and calculate update of value
for (BooleanProperty p : c.getAddedSubList()) {
p.addListener(changeListener);
if (p.getValue()) {
modification++;
}
}
}
// update count
count.set(count.get()+modification);
});