Предпосылки / контекст:
У меня есть HBox в качестве родителя и множество дочерних узлов (кнопки, текстовые поля, метки…). HBox является дочерним по отношению к другому контейнеру (BorderPane / VBox / Grid)
Мои вопросы:
Как мне динамически удалить / исключить родительский элемент (HBox) и всех его дочерних элементов из макета?
Я ищу свойство с тремя состояниями на Node (например, в Microsoft WPF):
Видимый - видимый и участвующий в макете
Свернутый - не отображается и не участвует в макете (также относится к его дочерним элементам)
Скрытый - не отображается, но участвует в макете
http://msdn.microsoft.com/en-us/library/ms590101.aspx
Какие варианты предлагает JavaFX?
Мои решения на данный момент:
hBox.setManaged(false);
- эта работа только для HBox, его дочерние элементы все еще присутствуют
root.getChildren (). remove (hBoxTop);
root.getChildren (). добавить (hBoxTop);
- Что ж, похоже, это может сработать ... но, например, в случае, если root является BorderPane, после того, как я удаляю / добавляю и удаляю HBox, пространство после него остается неиспользованным. Я уже пробовал requestLayout (), но id не заставляет Thrrot заполнять его. Я что-то упускаю? Правильный ли подход к этой проблеме?
Отредактировано:
Что ж, у меня это работает.
Динамическое удаление и добавление для этого конкретного случая может быть достигнуто за счет:
Удалить:
root.setTop(null);
Добавить:
root.setTop(hBoxTop);
Когда я не вызвал setTop (null) при удалении, BorderPane по-прежнему зарезервировал место для HBox (даже после удаления из его дочерних элементов).
ИМХО: это не очень хорошая модель, поскольку она специфична для родительского контейнера. Например, если я изменил BorderPane на VBox, мне также пришлось изменить эти методы. Для VBox удаление / добавление дочерней коллекции работает, но мне нужно запомнить индекс, чтобы HBox появлялся в том же месте после вызова add.