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

时间:2017-05-01 07:56:37

标签: java javafx javafx-8 observablelist

假设我有一个带有可观察类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!"));`.
  }
}

现在说在控制器类中我改变了SomeObservableClass对象之一的属性:

public class Controller(){
  private ParentClass parentClass;

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

这并没有激发听众。为什么?

我怀疑我缺少一些代码让监听器意识到当列表对象的任何属性被修改时它应该触发,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:3)

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