Node
, о котором вы говорите, известен как disclosureNode
и доступен через TreeCell
.
Узел раскрытия обычно представлен представленнымкак треугольник, который вращается на экране, чтобы указать, является ли TreeItem, который он расположен рядом, развернутым или свернутым.
Вы можете получить позицию этого Node
с такими свойствами, как Node.boundsInLocal
или Node.boundsInParent
.В Node
также есть методы для преобразования между координатными пространствами (например, localToScene
, sceneToLocal
и т. Д.).
Кроме того, следующий код является подозрительным:
root.addEventHandler(EventType.ROOT, (Event event) -> {
if (event.getEventType().getName().equals("BranchExpandedEvent")) {
}
});
Вам не нужно проверять имя EventType
.Вместо этого зарегистрируйте EventHandler
для EventType
, который вы хотите прослушать - в данном случае, TreeItem.branchExpandedEvent()
.Например, если ваши TreeItem
s имеют значения типа String
:
// "root" is a TreeItem<String>
// "event" is a TreeItem.TreeModificationEvent<String>
root.addEventHandler(TreeItem.<String>branchExpandedEvent(), event -> {
// do something...
});
Если вы должны проверить EventType
внутри EventHandler
, то проверьте, что EventType
s равны,не их имена;это менее подвержено ошибкам.
root.addEventHandler(Event.ANY, event -> {
if (event.getEventType().equals(TreeItem.branchExpandedEvent()) {
// do something...
}
});
Я хочу иметь эту позицию и добавить некоторые другие узлы (вертикальная линия в моем случае, чтобы соединить элементы дерева на том же уровне) вTreeView.
Я не рассматривал это, но похоже, что это должно быть реализовано TreeCell
.TreeItem
не должен много знать, если вообще что-то, о представлении.Другими словами, обработка этого внутри обработчика событий, добавленного в корень TreeItem
, кажется неправильным местом.Обратите внимание, что расширенный статус TreeItem
можно получить из TreeCell
, поскольку он имеет доступ к TreeItem
.
.