没有调用TornadoFX TreeView单元工厂

时间:2017-09-13 22:36:07

标签: tornadofx

这与my previous question

有关

我在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已正确填充,以便部件正常工作。还有什么方法可以让细胞工厂正确吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

同时,删除对cellFormat的调用,你应该是好的:)记住覆盖updateItem的规则:调用超级,清除文本/图形,如果!空,你有一个值,分配给文本和/或图形。

另外,请勿执行onDragDetected = EventHandler {...},而是执行setOnDragDetected {...}