我在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
永远不会被调用。所以我的拖放处理程序从未设置过,我的TreeCell
不是正确的类型。
单元格格式正确,并且TreeView
已正确填充,以便部件正常工作。还有什么方法可以让细胞工厂正确吗?
答案 0 :(得分:1)
调用cellFormat
实际上会创建一个CellFactory
,因此它会有效地覆盖自定义工厂的配置,因此您的回调永远不会附加到TreeView中使用的单元格。
如果您手动拨打setCellFactory
,则必须避免cellFormat
,而是覆盖单元格内的updateItem
以配置单元格的文本和图形。
我着眼于为DND实现自定义支持,以便您可以将cellFormat
与DND结合,而无需创建自定义单元工厂,但遗憾的是我现在没有时间开始这项工作。如果您认为当前的方法很麻烦,请在GitHub上创建一个问题,我们将尽快实现:)
同时,删除对cellFormat
的调用,你应该是好的:)记住覆盖updateItem
的规则:调用超级,清除文本/图形,如果!空,你有一个值,分配给文本和/或图形。
另外,请勿执行onDragDetected = EventHandler {...}
,而是执行setOnDragDetected {...}
。