TornadoFX TreeView 细胞工厂未被调用

TornadoFX TreeView cell factory not being called

这与 有关。

我在 BorderPane 布局的中央窗格中有一个 TreeView。通过从左窗格的列表中选择一个元素来填充此 TreeView。中心视图如下所示:

class CenterView : View() {
    override val root = TreeView<IStoryItem>()
    init {
        with(root) {
            root = TreeItem(controller.storySet)

            setCellFactory {
                object : StoryEditorCell() {
                    init {
                        System.out.println("Creating StoryEditorCell")
                        onDragDetected = EventHandler {...}
                        onDragOver= EventHandler {...}
                        onDragEntered= EventHandler {...}
                        ...
                    }
                }
            }
            cellFormat { ... }
            populate { ... }
        }
    }
}

正在调用 setCellFactory 函数,但由于某种原因,工厂本身的 init 从未被调用。所以我的 Drag/Drop 处理程序从未设置,我的 TreeCell 类型不正确。

单元格格式正确且 TreeView 填充正确,因此该部分工作正常。还需要做些什么才能使细胞工厂正确?

调用 cellFormat 实际上会创建一个 CellFactory,因此它将有效地覆盖您的自定义工厂配置,因此您的回调永远不会附加到 TreeView 中使用的单元格。

如果您手动调用 setCellFactory,则必须避免 cellFormat,而是在单元格内部覆盖 updateItem 以配置单元格的文本和图形。

我考虑过实现对 DND 的自定义支持,以便您可以将 cellFormat 与 DND 结合使用,而无需创建自定义单元工厂,但遗憾的是我现在没有时间开始这项工作。如果您觉得当前的方法很麻烦,请在 GitHub 上创建一个问题,我们会尽快处理 :)

与此同时,删除对 cellFormat 的调用,你应该会很好 :) 记住覆盖 updateItem 的规则:调用 super,清除 text/graphic,如果!空,你有一个值,分配给文本 and/or 图形。

此外,不要执行 onDragDetected = EventHandler {...},而是执行 setOnDragDetected {...}