我在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} }?
由于
答案 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
}