Фабрика ячеек 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 {...} вместо.

Другие вопросы по тегам