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
时至少两次。
具体来说,根据我发现的各种示例,当调用列的 TableCell
的 updateItem
方法时,我为该单元格创建了一个新的图形元素。这允许我为一列中的每一行使用不同的单元格类型,而不是一列中的每个单元格都相同的默认值。因此每次更新单元格时,都会创建一个新的(代理)TableCell,并向全局变量添加一个新的手表。
我不介意不断地创建新对象,因为 JVM 应该擅长垃圾回收,但我很恼火的是,对于每个新的 UI 元素,我都会向global-var
,没有机制知道什么时候做 remove-watch
。由于 TableView 的工作方式,即使只有一个 属性,每次数据更改时监视的数量也会增加(无限制)。
根据 Stage
的 onCloseRequest
,可能会有一些特殊情况,但这些不适用于 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
}
我正在 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
时至少两次。
具体来说,根据我发现的各种示例,当调用列的 TableCell
的 updateItem
方法时,我为该单元格创建了一个新的图形元素。这允许我为一列中的每一行使用不同的单元格类型,而不是一列中的每个单元格都相同的默认值。因此每次更新单元格时,都会创建一个新的(代理)TableCell,并向全局变量添加一个新的手表。
我不介意不断地创建新对象,因为 JVM 应该擅长垃圾回收,但我很恼火的是,对于每个新的 UI 元素,我都会向global-var
,没有机制知道什么时候做 remove-watch
。由于 TableView 的工作方式,即使只有一个 属性,每次数据更改时监视的数量也会增加(无限制)。
根据 Stage
的 onCloseRequest
,可能会有一些特殊情况,但这些不适用于 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
}