JavaFX,ObservableList:如何在列表对象被修改时触发InvalizationListener?

JavaFX,ObservableList:如何在列表对象被修改时触发InvalizationListener?,java,javafx,javafx-8,observablelist,Java,Javafx,Javafx 8,Observablelist,假设我有一个JavaFX应用程序,它有一个可观察类SomeObservableClass,它有一些属性: public class SomeObservableClass{ private StringProperty prop1 = new SimpleStringProperty(); private DoubleProperty prop2 = new SimpleDoubleProperty(); ... constructors, getters and setters

假设我有一个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();`
}
这不会激怒听众。为什么?


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

默认情况下,
observeList
不处理项内容的更改。但是使用提取器实例化
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.

默认情况下,
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.

使用此代码,您不应该期望listner提供任何信息,因为您修改了列表“addAll”,然后侦听事件。。。所以只要交换addlistner和addall,你就会看到一些东西。也许你正在修改其他地方的列表,但我不能see@user43968:不,我修改列表的意思是更改一些ObservableList项的属性。我将进行编辑以使其更清晰。当您修改prop1或prop2时,列表不会更改。但是,如果您想收听的内容是什么,为什么不直接在prop1和prop2上注册listner呢?@user43968因为这里我只放了两个,但在我的例子中,有15个左右的属性——为每一个设置listner都是不实际的。我只想在任何属性更改后立即使对象无效。另外,如何为列表中的每个对象注册侦听器?我应该重复它吗?这感觉真的很笨拙…你不应该期望listner用这段代码做任何事情,因为你修改了列表“addAll”,然后监听事件。。。所以只要交换addlistner和addall,你就会看到一些东西。也许你正在修改其他地方的列表,但我不能see@user43968:不,我修改列表的意思是更改一些ObservableList项的属性。我将进行编辑以使其更清晰。当您修改prop1或prop2时,列表不会更改。但是,如果您想收听的内容是什么,为什么不直接在prop1和prop2上注册listner呢?@user43968因为这里我只放了两个,但在我的例子中,有15个左右的属性——为每一个设置listner都是不实际的。我只想在任何属性更改后立即使对象无效。另外,如何为列表中的每个对象注册侦听器?我应该重复它吗?这感觉真的很笨拙……非常感谢:-)你知道一个好方法来获取侦听器中更新的对象吗?非常感谢:-)你知道一个好方法来获取侦听器中更新的对象吗?
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.
observableList.addListener((ListChangeListener) change -> {
    while (change.next()) {
        if (change.wasUpdated()) {
            SomeObservableClass changedItem = observableList.get(change.getFrom());
            System.out.println("ListChangeListener item: " + changedItem);
        }
    }
});