gpt4 book ai didi

JavaFX 8,带有复选框滚动 Pane 的 ListView 问题

转载 作者:太空宇宙 更新时间:2023-11-04 10:32:28 25 4
gpt4 key购买 nike

我正在使用带有复选框的 ListView 的单元工厂,例如:

  listView.setCellFactory(CheckBoxListCell.forListView(new Callback < Bean, ObservableValue < Boolean >> () {
@Override
public ObservableValue < Boolean > call(Bean item) {
BooleanProperty observable = new SimpleBooleanProperty();
observable.addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
if (!beanChoices.contains(item.toString())) {
beanChoices.add(item.toString());
observable.setValue(true);
//listView.scrollTo(listView.getItems().size() - 1);
}
} else if (wasSelected) {
if (beanChoices.contains(item.toString())) {
beanChoices.remove(item.toString());
observable.setValue(false);
}
}
});
/* [Code] which compares values with bean item string value and select observable to true for that for edit mode
but here the observer not called for beanItem that are under scrollpane of listview. But on scroll it gets called. */
return observable;
}
}));

它工作正常,但不适用于所有情况。案例:当我说出超过 10 个条目时,滚动 Pane 就会出现。假设我要检查位于 8 或 9 索引处的 beanChoices(您必须滚动才能查看它们)。
对于不可见的项目(位于滚动 Pane 下),不会调用监听器。
在调试时,我发现向下滚动时会调用监听器。

Problem: when I get checked values from beanChoices for above case, it return empty.
Detail: I have beanChoices which I need to make checked for listview items (edit mode). When I update without changing anything. (Assume that the value which is under the scrollpane of listview will be selected and added to beanChoices)

最佳答案

回调用于在项目与单元格关联时检索选中状态的属性。该元素可以随时从牢房中取出并放入新的牢房中。这就是 ListView(以及 TableView 等类似控件)的工作原理。每次有新项目与单元格关联时,CheckBoxListCell 只需获取选中状态属性即可。

返回值还用于设置CheckBox的初始状态。由于您没有使用正确的值正确初始化属性,因此不会保留初始状态。

另请注意,在更改监听器中将属性值更新为新值没有什么意义。无论如何它都会发生。

由于 BooleanProperty 是原语 boolean 的包装器,因此可能的值为 truefalseChangeListener 仅在 !Objects.equals(oldValue, newValue) 时被调用,您可以确定 isNowSelected = !wasSelected

当然你还需要返回值:

@Override
public ObservableValue < Boolean > call(Bean item) {
final String value = item.toString();
BooleanProperty observable = new SimpleBooleanProperty(beanChoices.contains(value));
observable.addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
beanChoices.add(value);
} else {
beanChoices.remove(value);
}
});
return observable;
}

我还建议使用 BeanCollection,而不是依赖于对象的字符串表示形式。 toString 许多不会产生唯一的结果,而 Beans.equals 将是比较对象的更好选择。

关于JavaFX 8,带有复选框滚动 Pane 的 ListView 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49855700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com