【问题标题】:How to copy all attached Listeners to new Node in JavaFX?如何将所有附加的侦听器复制到 JavaFX 中的新节点?
【发布时间】:2017-05-08 03:57:07
【问题描述】:

我有一个ObservableList<DataClass> someData,并附有一个ChangeListener(通过addListener)。该列表不时由后台线程更新。实际上不是 List 本身被更新,而是由线程返回的新 List 保存在成员 someData 中:

...
task.onSuccess(event -> setSomeData(task.getValue());
...
// standard setter generated by IntelliJ
public void setSomeData(ObservableList<DataClass> someData) { 
   this.someData = someData;
}

现在,当我使用标准设置器设置someData 时,数据本身在新列表中,好吧,但所有附加到旧列表的侦听器都消失了。我不想将整个 List 复制到我的旧 List 中,因为它可能包含大量元素。

我知道我可以将 Listeners 保存为成员变量并将它们重新分配给新的 List,但这会使代码聚集在一起,并且需要在 setter 方法中进行一些硬编码(因为在 ObservableList 中没有 #getListeners 方法) . [编辑:实际上我不能这样做,因为监听器是由另一个我不能/不想从这个类访问的类添加的。]

如何设置新的 List 来保留 Listeners 而不复制每个元素?

我使用的是最新版本的 Java。

【问题讨论】:

    标签: java javafx listener


    【解决方案1】:

    如果没有更多信息,最好的方法似乎是使用ListProperty。它是一个Property&lt;ObservableList&lt;ItemType&gt;&gt;,但也实现了ObservableList&lt;ItemType&gt;(内容是被属性包裹的列表的内容)。

    使用此类允许您将侦听器添加到ListProperty,但仍保持替换数据的代码简单:

    private final ListProperty<DataClass> someData = new SimpleListProperty<>();
    
    public void setSomeData(ObservableList<DataClass> someData) { 
       this.someData.set(someData);
    }
    
    ...
    
    this.someData.addListener(someListener);
    

    【讨论】:

    • hmm 但这不是和this.someData.clear(); this.someData.addAll(someData) 的效果一样,复制每个元素吗?
    • @LPrc 不完全。如果您调用clear 并调用addAll,您将触发2 个更改,而ListProperty.set 您只会触发一个更改。这一变化可能是由setAll 触发的。但是请注意,您的选择受到您所做的设计选择的限制(其他类确定 ObservableList 实现;应该保留侦听器...),但是使用这种方法,您仍然可以将 ObservableList 作为后备列表,而不是简单地复制内容...
    【解决方案2】:

    不要删除引用,只是删除它的内容

    task.onSuccess(event -> someData.setAll(task.getValue()));
    

    【讨论】:

      猜你喜欢
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      相关资源
      最近更新 更多