JavaFX:如何在无法再访问属性时收到通知?

时间:2015-02-13 22:15:13

标签: clojure javafx

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

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

实施" observable"模式,我在每个JFX属性上都有ChangeListener(例如textProperty内的TableCell的{​​{1}}),它会更新整个global-var。

要通知global-var更改的各种属性,我还会在接收更改通知的每个属性的global-var上执行TableView,并使用一些特殊情况来防止无限循环。

问题是 un 注册手表。在add-watch的情况下,JFX引擎始终创建新单元格 - 至少两次用于显示窗口,并且每次更新TableView时显然至少两次。

具体来说,按照我发现的各种示例,当调用列的global-var TableCell方法时,我为此创建了一个新的图形元素细胞。这允许我为列中的每一行提供不同的单元格类型,而不是列中每个单元格相同的默认单元格类型。因此,每次更新单元格时,都会创建一个新的(代理)TableCell,并将新监视添加到global-var。

我不介意不断创建新对象,因为JVM应该善于垃圾收集,但我很恼火,因为每个新的UI元素我都会添加一个额外的手表。 updateItem,没有机制知道何时进行global-var。即使使用单个属性,每次数据更改时手表的数量都会增加(不受限制),因为TableView的工作方式。

根据remove-watch Stage,可能会出现一些特殊情况,但这些情况不适用于onCloseRequest

所以问题是,有没有办法通过某种类型的析构函数,事件,回调或其他通知来查找JFX TableView何时不再可访问,这样我{{1} }?

由于

1 个答案:

答案 0 :(得分:0)

细胞被重复使用。在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
}