Почему вы слушаете листовые изменения и когда он вызывается?
Для обработки случая, когда TreeItem
ы динамически добавляются и / или удаляются.TreeItem
является листом тогда и только тогда, когда его список children
пуст.Если элемент добавлен, и теперь лист становится веткой, нам нужно обновить псевдокласс BRANCH
, чтобы применить правильный CSS.То же самое, если элемент удален, а ветвь становится листом.
Это может относиться или не относиться к вашему варианту использования.Если нет, то не стесняйтесь удалить эту часть реализации.
Вы отметили getTreeItem() != event.getTreeItem())
в обработчике, отмеченном флажком.Зачем?Это будет вызвано, когда флажок будет установлен / снят.
Когда вы (не) проверяете CheckBoxTreeItem
, это вызывает событие.Это событие начинает свое путешествие с CheckBoxTreeItem
, который был (не) отмечен.Оттуда он перемещается вверх (т.е. пузыри) по иерархии предметов вплоть до корня.Для каждого элемента будут вызываться любые зарегистрированные обработчики.Хотя, если событие используется, оно не переходит к следующему родительскому элементу.
Причина, по которой мы добавляем обработчик, заключается в том, чтобы прослушивать любые (1060 * дочерние ) проверки (не), но только прямые дети .Мы не заботимся ни об изменениях в произвольно глубоких потомках, ни об элементе, к которому был зарегистрирован обработчик.
Поскольку нас интересуют только изменения в непосредственных дочерних элементах, нам нужно убедиться, что мы реагируем только на события, инициированные указанными дочерними элементами.,Поскольку событие обрабатывается первым элементом, который был (не) проверен, нам не нужно ничего делать в этом первом обработчике.Мы можем сделать это, проверив, является ли TreeItem
содержащего TreeCell
тем же, который вызвал событие, и метод TreeModificationEvent#getTreeItem()
возвращает элемент, вызвавший событие (т.е.элемент, который был (не) проверен).Если это один и тот же экземпляр, ничего не делайте, и пусть событие всплывет к родителю.
Теперь обработчик родительского элемента обрабатывает событие.Это означает, что getTreeItem() != event.getTreeItem()
вернет true
, и мы войдем в блок if
.Это вызывает обновление, если необходимо, состояния псевдоклассов.Затем мы используем событие, чтобы оно не всплывало до следующего родителя;это эффективно заставляет обработчик слушать только события от direct children .
Обратите внимание, что если родительский элемент в данный момент не отображается в дереве, он не будет частью ячейки.Если он не является частью ячейки, к нему не будет добавлен обработчик.Таким образом, любые не отображаемые элементы не будут затронуты этим.Это нормально, поскольку все, что мы обновляем, чисто визуально;если элемент не отображается, то нет визуальных элементов для обновления.