JavaFX,ObservableList:每当列表的对象被修改时如何触发 InvalidationListener?

JavaFX, ObservableList: How to fire an InvalidationListener whenever an object of the list gets modified?

假设我有一个 JavaFX 应用程序,它具有可观察的 class SomeObservableClass 和一些属性:

public class SomeObservableClass{

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

  ... constructors, getters and setters
}

和另一个 class 有一个 属性:

public class ParentClass{
  private ObservableList<SomeObservableClass> sOC = FXCollections.observableArrayList();`
}

在这个父 class 中,我为可观察列表添加了一个侦听器:`

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!"));`.
  }
}

现在假设在控制器中 class 我更改了 SomeObservableClass 对象之一的 属性:

public class Controller(){
  private ParentClass parentClass;

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

这不会触发侦听器。为什么 ?

我怀疑我缺少一些代码来让侦听器知道它应该在列表对象的 any 属性 被修改时触发,但我不知道怎么做。

默认情况下,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);
        }
    }
});