gpt4 book ai didi

JavaFX,可观察列表 : How to fire an InvalidationListener whenever an object of the list gets modified?

转载 作者:行者123 更新时间:2023-11-29 04:31:20 25 4
gpt4 key购买 nike

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

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

现在假设在 Controller 类中我更改了 SomeObservableClass 对象之一的属性:

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 可以识别更新的项目。请尝试一下。

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

关于JavaFX,可观察列表 : How to fire an InvalidationListener whenever an object of the list gets modified?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43716022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com