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

JavaFX,ObservableList:如何在列表对象被修改时激发InvalidationListener?

卫博
2023-03-14
public class SomeObservableClass{

  private StringProperty prop1 = new SimpleStringProperty();
  private DoubleProperty prop2 = new SimpleDoubleProperty();

  ... constructors, getters and setters
}
public class ParentClass{
  private ObservableList<SomeObservableClass> sOC = FXCollections.observableArrayList();`
}
public class ParentClass{
  private ObservableList<SomeObservableClass> observableList = FXCollections.observableArrayList();

  public`ParentClass(List<SomeObservableClass> list){
    this.observableList.addAll(list);
    this.observableList.addListener((InvalidationListener) observable -> System.out.println("listener detected a change!"));`.
  }
}
public class Controller(){
  private ParentClass parentClass;

  public void changeSomeProps(){
    SomeObservableClass anObservableObject = parentClass.getObservableList().get(0);
    anObservableObject.setProp1("newVal");
  }
}

我怀疑我缺少一些代码来让侦听器知道当列表对象的任何属性被修改时它应该触发,但我不知道如何做到这一点。

共有1个答案

越英范
2023-03-14

默认情况下,ObservableList不处理项内容的更改。但是用提取器实例化ObservableList可以处理它们。

ObservableList<SomeObservableClass> observableList = FXCollections.observableArrayList(
            e -> new Observable[]{e.prop1Property(), e.prop2Property()});

// add items and set listeners here

observableList.get(1).setProp1("newVal");
// It fires InvalidationListener and ListChangeListener.

编辑:

似乎只有ListChangeListener才能识别更新的项。请试试看。

observableList.addListener((ListChangeListener) change -> {
    while (change.next()) {
        if (change.wasUpdated()) {
            SomeObservableClass changedItem = observableList.get(change.getFrom());
            System.out.println("ListChangeListener item: " + changedItem);
        }
    }
});
 类似资料:
  • 我有以下列表,里面是另一个列表,然后是字符串列表 <代码>列表 示例 除了执行嵌套循环并最终替换列表之外,还有更好的方法吗?也许有溪流?

  • 问题内容: 我正在尝试遍历: …并提取中的每个元素。这是我的方法: 这里的问题是对的每次调用都会从中删除元素,从而修改其大小,从而导致以下错误: 那么…当元素动态变化时,我该如何遍历其中的元素呢? 问题答案: 其他人则提到了正确的解决方案,而没有实际阐明。所以这里是: 另外,如果您想安全地在assign函数中更改映射,则需要传入迭代器(只能使用remove函数,并且只能使用一次)或条目来更改值。

  • 我需要创建一个客户列表,每个客户都有一个工作列表。当将一个列表分配给一个客户机时,它是通过引用传递的,对列表的任何更改(例如清除列表)也会反映在客户机对象中。 我该如何避免这种情况?

  • 问题内容: 我正在研究一个第三方开发人员用来为我们的核心应用程序编写扩展的Python库。 我想知道引发异常时是否可以修改回溯,因此最后一个堆栈帧是对开发人员代码中库函数的调用,而不是对引发异常的库中的行的调用。堆栈底部还有一些框架,其中包含对第一次加载我理想上也希望删除的代码时使用的函数的引用。 在此先感谢您的任何建议! 问题答案: 不更改回溯怎么办?您要求的两件事都可以通过不同的方式轻松完成。

  • 在Vue.js中,我有三个模板,它们应该一起工作以触发加载新结果。我的容器模板是一个包含过滤器和结果模板的通用模板。当过滤器模板中的对象发生更改时,我很难在结果模板中触发更改。流程非常简单。以下是我目前的情况以及流程的工作原理: 筛选模板:单击后,我的对象属性将更新为新值,并将此更改发送到容器模板。 容器模板:-此角色仅用于保存筛选器和结果模板,并将修改后的对象传递给结果模板。 结果模板:

  • 我知道有人在不同的日期问过类似的问题,但我会在这里放一个SSCCE,尽量简单地问这个问题。 我希望能够更新数据模型,并使其上的任何视图自动更新,这样任何更新模型的调用者都不会知道当前有任何视图。这是我到目前为止学到/尝试的,并且没有调用它不会更新。我错过了什么? 主要的java: 全体船员Java语言