【问题标题】:JavaFX: How to be notified when a Property is no longer reachable?JavaFX:当属性不再可访问时如何通知?
【发布时间】:2015-02-14 10:09:47
【问题描述】:

我正在 Windows x64 上的 Clojure (1.6) 中编写一堆 JavaFX (8.0) 代码。

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

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

为了通知 global-var 的各个属性的更改,我还在 global-var 上为每个收到更改通知的属性做add-watch,并在一些特殊情况下防止无限循环。

问题是un注册手表。在TableView 的情况下,JFX 引擎一直创建新单元格——至少两次仅用于显示窗口,显然每次更新global-var 时至少两次。

具体来说,按照我找到的各种示例,当调用列的TableCellupdateItem 方法时,我会为该单元格创建一个新的图形元素。这允许我为一列中的每一行使用不同的单元格类型,而不是默认列中的每个单元格都相同。所以每次更新单元格时,都会创建一个新的(代理)TableCell,并在 global-var 中添加一个新的 watch。

我不介意不断创建新对象,因为 JVM 应该擅长垃圾回收,但我很恼火的是,对于每个新的 UI 元素,我都会在 global-var 中添加一个额外的手表,而没有知道什么时候做的机制remove-watch。由于 TableView 的工作方式,即使使用单个属性,每次数据更改时,手表的数量也会增加(无限制)。

基于StageonCloseRequest 可能存在一些特殊情况,但这些不适用于TableView

所以问题是,有没有办法找到 JFX Property 何时不再可访问,无论是通过某种类型的析构函数、事件、回调或其他通知,以便我可以 remove-watch

谢谢

【问题讨论】:

    标签: clojure javafx


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多