JavaFX:如何使包含其他Observable对象列表的Observable对象无效

时间:2017-04-23 09:06:18

标签: java javafx javafx-8

我对javaFX中的听众感到有些困惑。

我有一个实现Observable的类(我们称之为ObservedContainer),它包含一些Observables对象的列表:

public class ObservedContainer implements Observable {
  ArrayList<AnotherObservableClass> someOtherClasses;
  (...observable implementation omitted for brevity)
}

当我从数组中添加或删除某些内容时,我可以使该类无效 - 这没关系:

public class ObservedContainer implements Observable {
  ArrayList<AnotherObservableClass> someOtherClasses = new ArrayList<>();
  (...observable implementation omitted for brevity)

  public void addAnotherObservableClass(AnotherObservableClass a){
    someOtherClasses.add(a);
    fireInvalidationEvent();
    // This just notifies all listeners that the object has changed
  }

  public void removeAnotherObservableClass(AnotherObservableClass a){
    someOtherClasses.remove(a);
    fireInvalidationEvent();
  }  
}

但是,当数组中的对象被修改时,如何触发失效事件呢? ObservedContainer对象是否应该作为每个AnotherObservableClass对象的监听器进行预订,并对此作出反应?

谢谢!

1 个答案:

答案 0 :(得分:1)

有一个类应该为您处理:ObservableList

FXCollections.observableArrayList method可用于触发对列表中元素属性修改的更新更改。

实施例

ObservableList<Node> list = FXCollections.observableArrayList(node -> new Observable[] { node.translateXProperty() });

如果其中一个列表元素的translateX属性被修改,则会触发侦听器。

如果你坚持在自己的类中包装列表,你可以简单地添加一个触发包装器的失效事件的监听器:

list.addListener((Observable o) -> fireInvalidationEvent());