JavaFX 8,ListView with Checkboxes scrollpane问题

时间:2018-01-17 08:56:51

标签: java listview javafx javafx-8 javafx-2

我正在使用cellview for 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个条目时,滚动窗格会出现。假设我有要检查的beanChoices是8或9索引(你必须滚动查看它们。)没有调用不可见的项目(在滚动窗格下)的监听器。
在Debug上,我发现当我向下滚动时会调用监听器。

  

问题:当我从上面的案例中的beanChoices获得检查值时,它返回空   细节:我有beanChoices,我需要检查listview项目(编辑模式)。当我更新而不改变任何东西。 (假设将选择listview滚动窗格下的值并将其添加到beanChoices中)

1 个答案:

答案 0 :(得分:1)

当项目与单元格关联时,Callback用于检索已检查状态的属性。可以从单元格中删除该项目,并随时将其放入新项目中。这就是ListView(以及TableView之类的类似控件)的工作原理。每次新项目与单元格关联时,CheckBoxListCell只会获取已检查的州属性。

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

另请注意,将属性的值更新为更改侦听器中的新值没有多大意义。无论如何它都会发生。

由于BooleanProperty是原始boolean的包装器,因此可能的值为truefalse;只有在ChangeListener您才能确定!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;
}

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