Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure JavaFX:当属性不再可访问时,如何得到通知?_Clojure_Javafx - Fatal编程技术网

Clojure JavaFX:当属性不再可访问时,如何得到通知?

Clojure JavaFX:当属性不再可访问时,如何得到通知?,clojure,javafx,Clojure,Javafx,我正在用Clojure(1.6)在Windowsx64上编写大量JavaFX(8.0)代码 我的域/应用程序数据是位于ref/atom中的嵌套Clojure哈希映射,我希望将映射的特定子元素绑定到一个或多个UI元素。把这张大地图称为全球变量。我不希望将我的域数据维护为一组JFX属性,因为这是使用Clojure及其数据结构和函数的全部目的,所以我不考虑使用JFXBind…函数将UI元素与域数据绑定。我只处理JFX属性,因为它们自然存在于JFX对象中,并尝试不创建更多 为了实现“可观察”模式,我在每

我正在用Clojure(1.6)在Windowsx64上编写大量JavaFX(8.0)代码

我的域/应用程序数据是位于ref/atom中的嵌套Clojure哈希映射,我希望将映射的特定子元素绑定到一个或多个UI元素。把这张大地图称为全球变量。我不希望将我的域数据维护为一组JFX属性,因为这是使用Clojure及其数据结构和函数的全部目的,所以我不考虑使用JFX
Bind…
函数将UI元素与域数据绑定。我只处理JFX属性,因为它们自然存在于JFX对象中,并尝试不创建更多

为了实现“可观察”模式,我在每个JFX属性上都有一个
ChangeListener
(例如
TableView
TableCell
textProperty
),它更新了整个全局变量

为了通知全局变量更改的各种属性,我还为接收更改通知的每个属性在全局变量上添加了
addwatch
,并使用一些特殊情况来防止无限循环

问题是注销手表。在
TableView
的情况下,JFX引擎总是创建新的单元格——至少两次仅用于显示窗口,显然每次更新
全局变量时至少两次

具体来说,根据我找到的各种示例,当调用列的
TableCell
updateItem
方法时,我为该单元格创建了一个新的图形元素。这使我可以为列中的每一行使用不同的单元格类型,而不是默认情况下列中的每个单元格都相同。因此,每次更新单元格时,都会创建一个新的(TableCell的代理),并向global-var添加一个新的手表

我不介意不断地创建新对象,因为JVM应该擅长垃圾收集,但我很恼火的是,对于每个新的UI元素,我都会向
全局变量
添加一个额外的监视,而没有机制知道何时执行
删除监视。即使只有一个属性,由于TableView的工作方式,每次数据更改时手表的数量也会增加(不受限制)

基于
阶段
onCloseRequest
可能存在一些特殊情况,但这些情况不适用于
表视图

所以问题是,有没有一种方法可以找到JFX
属性不再可访问的时间,可以通过某种类型的析构函数、事件、回调或其他通知,这样我就可以
删除watch


谢谢

电池可以重复使用。在
updateItem
中,首先清理旧项目之后的内容,然后为新项目设置它。我不知道
addwatch
/
remove watch
在Clojure中是如何工作的,但下面是您的
updateItem
方法的框架:

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

    removeOldWatch(); // whatever that means

    addWatch(); // whatever that means
}