Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data binding 绑定:计算可观察列表中true booleanproperty的数量_Data Binding_Javafx - Fatal编程技术网

Data binding 绑定:计算可观察列表中true booleanproperty的数量

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())); 我希望将此计数值更新为列表中的

我有一个任务表视图,其中有一列复选框。我已经设法使用stream().map()提取了列值。我想计算列表中的真实值

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