Javafx 带有单元工厂和后台线程的自定义TreeCell 如何使TreeView在发生内容时填充ProgressIndicators,但不使用单元格工厂阻塞线程 TreeItem.setGraphic()与TreeCell.setGraphic()有何不同 当我实例化TreeItem时,我需要将图形设置为ProgressIndicator,但我不确定这是否应该在创建TreeItem时发生,还是从工厂转储的TreeCell.updateItem中发生 我认为当使用细胞工厂时,所有图形化的东西都需要在那里发生,因此TreeItem.setGraphic只是一种方便,我应该从updateItem中找出我的问题

Javafx 带有单元工厂和后台线程的自定义TreeCell 如何使TreeView在发生内容时填充ProgressIndicators,但不使用单元格工厂阻塞线程 TreeItem.setGraphic()与TreeCell.setGraphic()有何不同 当我实例化TreeItem时,我需要将图形设置为ProgressIndicator,但我不确定这是否应该在创建TreeItem时发生,还是从工厂转储的TreeCell.updateItem中发生 我认为当使用细胞工厂时,所有图形化的东西都需要在那里发生,因此TreeItem.setGraphic只是一种方便,我应该从updateItem中找出我的问题,javafx,Javafx,我正在做文件浏览器的例子。TreeView中的每个项都将值设置为sun.nio.fs.WindowsPath,并通过从TreeItem继承来实现。我覆盖isLeaf()和getChildren()。问题是,isLeaf()在未插入网络的情况下,在网络驱动器上可能需要很长时间 这就是我创建一个具有路径值的新树项所做的工作(尚未使用单元工厂): 启动新线程(使用Clojure futures),使用isRegularFile()检查路径值是否为路径或文件。此操作的结果稍后在取消对未来的引用时可用 实

我正在做文件浏览器的例子。
TreeView
中的每个项都将值设置为
sun.nio.fs.WindowsPath
,并通过从
TreeItem
继承来实现。我覆盖
isLeaf()
getChildren()
。问题是,
isLeaf()
在未插入网络的情况下,在网络驱动器上可能需要很长时间

这就是我创建一个具有路径值的新树项所做的工作(尚未使用单元工厂):

  • 启动新线程(使用Clojure futures),使用
    isRegularFile()
    检查路径值是否为路径或文件。此操作的结果稍后在取消对未来的引用时可用
  • 实例化匿名
    TreeItem
    派生的实例(使用Clojure代理)
  • 使用
    ProgressIndicator()
    在新的
    TreeItem
    实例上调用
    setGraphic()
  • 启动另一个线程,检查第一个线程的结果。第一个线程完成后,第一个线程将根据叶函数的值设置相应的文件或文件夹图标,并使用本地匿名函数调用
    addEventHandler()
    ,这些函数根据展开或折叠更改图形
  • 在任何一个新线程完成之前,返回
    TreeItem的新实例(从步骤2开始)
  • 这样做的效果是在
    isLeaf
    运行时,在每个网络驱动器上放置一个漩涡状图形。但是当TreeItem和TreeCell似乎都有一个
    setGraphic()
    函数时,我不知道如何做到这一切;我不确定谁“拥有”什么。我认为
    TreeView
    同时拥有项目和单元格,在
    TreeItem
    上调用
    setGraphic()
    在不使用自定义单元格工厂的情况下以某种方式引用默认单元格的图形


    我需要弄清楚如何从cell factory中访问isLeaf值
    updateItem()
    ,等等。

    您签出了吗?是的,我以前看到过。问题是JavaFX对Java来说很好,但对Clojure来说却不是那么好。Clojure futures可以满足本例中的Java任务。在我的cell factory中,我必须访问TreeItem的一些内部状态,以确定要显示什么以及何时显示,但我不能这样做,除非我向TreeItem派生添加一个有状态属性,这是可能的,但有点痛苦。我一直在试图找出如何以Clojure喜欢的方式使用不可变结构来实现这一点。