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