Javafx,Observablelist:每当列表的对象被修改时,如何触发无效的Listener



说我有一个带有可观察类SomeObservableClass的Javafx应用,带有某些属性:

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

现在说,在控制器类中,我更改了一个observableclass对象的属性:

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

这不会解雇听众。为什么 ?

我怀疑我缺少一些代码,以使听众意识到列表对象的任何属性都会被修改时它应该发射,但我不知道该怎么做。

默认情况下,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 can 标识更新的项目。请尝试一下。

observableList.addListener((ListChangeListener) change -> {
    while (change.next()) {
        if (change.wasUpdated()) {
            SomeObservableClass changedItem = observableList.get(change.getFrom());
            System.out.println("ListChangeListener item: " + changedItem);
        }
    }
});

最新更新