【问题标题】:JavaFX: How to invalidate an Observable object that contains a list of other Observable objectsJavaFX:如何使包含其他可观察对象列表的可观察对象无效
【发布时间】:2017-04-23 09:06:17
【问题描述】:

我对 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 对象的侦听器,并对此做出反应?

谢谢!

【问题讨论】:

    标签: java javafx javafx-8


    【解决方案1】:

    有一个类应该为你处理这个问题:ObservableList

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

    示例

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

    如果列表元素之一的translateX 属性被修改,将触发侦听器。

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

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

    【讨论】:

    • 也许我做错了什么,但是当我修改底层对象的属性时这似乎不起作用?我希望当列表中 any 对象的 any 属性被修改时,列表无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多