Фабрика ячеек TornadoFX TreeView не вызывается
Это связано с моим предыдущим вопросом.
У меня есть TreeView в центральной панели макета BorderPane. Этот 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
заполнен правильно, так что часть работает правильно. Что еще нужно сделать, чтобы правильно настроить фабрику клеток?
1 ответ
Призвание cellFormat
на самом деле создает CellFactory
Таким образом, он будет эффективно перезаписывать вашу конфигурацию пользовательской фабрики, поэтому ваши обратные вызовы никогда не будут привязаны к ячейке, используемой в вашем TreeView.
Если вы звоните вручную setCellFactory
ты должен избегать cellFormat
и вместо этого переопределить updateItem
внутри ячейки для настройки текста и графики ячейки.
Я посмотрел на реализацию пользовательской поддержки DND, чтобы вы могли объединить cellFormat
с DND без необходимости создания собственной фабрики ячеек, но, к сожалению, у меня нет времени начинать эту работу прямо сейчас. Если вы чувствуете, что текущий подход громоздок, пожалуйста, создайте проблему на GitHub, и мы доберемся до этого как можно скорее:)
А пока удалите звонок cellFormat
и тебе должно быть хорошо:) Запомни правила переопределения updateItem
: Вызовите super, очистите текст / графику, если! Пусто, и у вас есть значение, назначьте текст и / или графику.
Кроме того, не делай onDragDetected = EventHandler {...}
, делать setOnDragDetected {...}
вместо.