JavaFX:当 属性 不再可达时如何收到通知?

JavaFX: How to be notified when a Property is no longer reachable?

我正在 Windows x64 上用 Clojure (1.6) 编写一堆 JavaFX (8.0) 代码。

我的 domain/application 数据是嵌套的 Clojure 散列映射,位于 ref/atom 中,我希望将映射的特定子元素绑定到一个或多个 UI元素。称这张大地图为global-var。我不希望将我的域数据作为一堆 JFX 属性来维护,因为这是使用 Clojure 及其数据结构和函数的全部要点,所以我不考虑使用 JFX Bind... 函数来绑定 UI 元素到我的域数据。我只处理 JFX 属性,因为它们自然存在于 JFX 对象中并且尽量不创建更多。

为了实现 "observable" 模式,我在每个 JFX 属性 上都有一个 ChangeListener(例如 TableCell 中的 textProperty [= =16=]) 更新整个全局变量。

为了通知 global-var 变化的各种属性,我还在 global-var 上为每个 属性 接收变化通知做 add-watch,有一些特殊情况可以防止无限循环。

问题是注册手表。在 TableView 的情况下,JFX 引擎一直在创建新的单元格——至少两次只是为了显示 window,显然每次我更新 global-var 时至少两次。

具体来说,根据我发现的各种示例,当调用列的 TableCellupdateItem 方法时,我为该单元格创建了一个新的图形元素。这允许我为一列中的每一行使用不同的单元格类型,而不是一列中的每个单元格都相同的默认值。因此每次更新单元格时,都会创建一个新的(代理)TableCell,并向全局变量添加一个新的手表。

我不介意不断地创建新对象,因为 JVM 应该擅长垃圾回收,但我很恼火的是,对于每个新的 UI 元素,我都会向global-var,没有机制知道什么时候做 remove-watch。由于 TableView 的工作方式,即使只有一个 属性,每次数据更改时监视的数量也会增加(无限制)。

根据 StageonCloseRequest,可能会有一些特殊情况,但这些不适用于 TableView

所以问题是,是否有一种方法可以通过某种类型的析构函数、事件、回调或其他通知找到 JFX Property 何时不再可用,这样我就可以 remove-watch?

谢谢

细胞被重复使用。在updateItem中,先清理旧项,然后再为新项设置。我不知道 add-watch/remove-watch 在 Clojure 中是如何工作的,但这里是 updateItem 方法的框架:

public void updateItem(T item, boolean empty) {
    super.updateItem(item, empty);

    removeOldWatch(); // whatever that means

    addWatch(); // whatever that means
}