Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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
JavaFX8,带复选框的ListView滚动窗格问题_Java_Listview_Javafx_Javafx 8_Javafx 2 - Fatal编程技术网

JavaFX8,带复选框的ListView滚动窗格问题

JavaFX8,带复选框的ListView滚动窗格问题,java,listview,javafx,javafx-8,javafx-2,Java,Listview,Javafx,Javafx 8,Javafx 2,我将cell factory用于listview,并带有如下复选框: listView.setCellFactory(CheckBoxListCell.forListView(new Callback < Bean, ObservableValue < Boolean >> () { @Override public ObservableValue < Boolean > call(Bean item) { BooleanProperty

我将cell factory用于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;
  }
}));
listView.setCellFactory(CheckBoxListCell.forListView)(新回调>(){
@凌驾
公共observeValue调用(Bean项){
BooleanProperty observable=新的SimpleBoleanProperty();
observable.addListener((obs、wasSelected、isNowSelected)->{
如果(现在已选定){
如果(!beanChoices.contains(item.toString())){
添加(item.toString());
可观察。设定值(真);
//scrollTo(listView.getItems().size()-1);
}
}否则如果(已选择){
if(beanChoices.contains(item.toString())){
beanChoices.remove(item.toString());
可观察。设定值(假);
}
}
});
/*[Code]将值与bean项字符串值进行比较,并为编辑模式选择observable to true
但在这里,观测者并没有调用listview的scrollpane下的beanItem,而是在scroll上调用它*/
可观测收益;
}
}));
它工作正常,但并非适用于所有情况。 案例:当我说超过10个条目时,滚动窗格就会出现。假设我要检查索引为8或9的beanChoices(您必须滚动才能查看它们)。
对于不可见的项目(在滚动窗格下),不会调用侦听器
在调试时,我发现向下滚动时调用了侦听器

问题:当我从beanChoices获取上述情况的检查值时,它返回空值。
详细信息:我有beanChoices,我需要检查listview项(编辑模式)。当我更新而不做任何更改时。(假设listview滚动窗格下的值将被选中并添加到beanChoices)


当项目与单元格关联时,
回调
用于检索选中状态的属性。可以随时从单元格中删除该项目并将其放入新单元格。这就是
ListView
(以及类似的控件,如
TableView
)的工作原理
CheckBoxListCell
每次新项与单元格关联时,都会简单地获取checked state属性

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

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

由于
BooleanProperty
是原语
boolean
的包装,因此可能的值为
true
false
;只有在
时才会调用
ChangeListener
!Objects.equals(oldValue,newValue)
您可以确保
isNowSelected=!已选定

当然,您还需要返回以下值:

@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;
}
@覆盖
公共observeValue调用(Bean项){
最终字符串值=item.toString();
BooleanProperty observable=新的SimpleBoleAnProperty(beanChoices.contains(value));
observable.addListener((obs、wasSelected、isNowSelected)->{
如果(现在已选定){
豆蔻。增加(价值);
}否则{
删除(值);
}
});
可观测收益;
}

我还建议使用
Bean
s的
集合,而不是依赖对象的字符串表示
toString
很多都不会产生独特的结果和
Bean。equals
将是比较对象的更好选择。

谢谢@fabian,您的回答真的很有帮助,信息量很大。但我的问题仍然存在。“不可见项(在滚动窗格下)不调用侦听器。”@SinghAmarjeet不可见项不能调用侦听器。只能通过单击单元格修改属性,而不能单击未显示的单元格。顺便说一句:您不希望
ListView
beanChoices
集合之外的其他地方自动检索数据。顺便问一下:你什么时候检查数据?您确定用户已经与GUI交互了吗?我刚刚创建了一个
应用程序
,以测试是否存在任何问题,但我找不到任何问题。很抱歉,没有分享问题的全部细节。您可以看到我在问题中添加了更多的细节。@SinghAmarjeet我不能100%确定“我需要检查listview项(编辑模式)…”是否意味着最初应该选择这些值,或者您是否希望通过代码听取更改,但在前一种情况下,您可以简单地执行
beanChoices.clear();listView.getItems().stream().map(Bean::toString).forEach(beanChoices::add)