当前位置: 首页 > 知识库问答 >
问题:

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

杨和蔼
2023-03-14

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

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

问题:当我在上面的情况下从beanChoices中得到选中的值时,它返回空。
详细信息:我有一个beanChoices,我需要检查listview项(编辑模式)。当我更新而没有改变任何东西的时候。(假设listview的scrollpane下的值将被选中并添加到beanChoices中)

共有1个答案

杨建章
2023-03-14

当项与单元格关联时,回调用于检索选中状态的属性。该项目可随时从单元格中移除并放入新单元格中。这就是ListView(以及类似的控件,如TableView)的工作方式。CheckBoxListCell只需在每次与单元格关联新项时获取checked state属性。

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

还要注意,在更改侦听器中将属性值更新为新值没有什么意义。不管怎样都会发生。

由于BooleanProperty是原语Boolean的包装器,可能的值为truefalse;只有当!objects.equals(oldValue,newValue)可以确保是nowselected=!wasselected时,才调用ChangeListener

当然,您还需要返回值:

@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;
}
 类似资料:
  • 基于此注释https://stackoverflow.com/a/29530135/1387524,我添加了一个ScrollPane,以便在画布移到可见区域之外时使用滚动。

  • 我正在做一个项目,其中有两个选项卡。在first Tab的用户界面上有一个文本字段和一个按钮。在文本字段中,用户可以写到100之前的任何数字,当他按下按钮Next时,我的应用程序将转到下一个选项卡,在该选项卡上有一个带有三列a、B和C的Gridpane。 所以我想要的是用户将在第一个选项卡的文本字段中输入的任何数字,根据该数字,它应该在第二个选项卡的GridPane中添加相同数量的Textfiel

  • 我正在尝试获取一些关于组件的信息,这些组件按标准包含在中。特别是我对阅读水平的感兴趣。我怎么参考?

  • 我在javafx文本区域有一个问题:当我聚焦文本区域时,边框被应用...那还可以。 但是当我用滚动条手柄拖动时,文本区域边框焦点会丢失。 见下图:

  • 我已经设法让我的应用程序在复选框状态更改时更新数据库,但当我滚动应用程序时,复选框的状态会更改。 我的问题是:如何保存复选框的状态,以便在滚动视图时它们不会更改? 这是我的光标适配器。

  • 我有一些关于滚动窗格的默认背景和边框的问题。使用这种风格使问题看得更清楚。 我试过这种风格,但没有运气,只有红色的边框消失了,留给我的是蓝色的。 我查看了这个旧的后JavaFX隐藏滚动窗格灰色边框和http://docs.oracle.com/JavaFX/2/ui_controls/editor.htm 这行代码也不起作用 谢谢