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);
}
}
});
假设我有一个 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);
}
}
});