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 {...}
。
这与
我在 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 {...}
。