假设我有一个带有可观察类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");
}
}
这并没有激发听众。为什么?
我怀疑我缺少一些代码让监听器意识到当列表对象的任何属性被修改时它应该触发,但我不知道该怎么做。
答案 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);
}
}
});