JavaFX - динамически исключить / включить родителя и всех его дочерних элементов из макета

Предпосылки / контекст:

У меня есть 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.


person Radek Červenec    schedule 18.10.2012    source источник


Ответы (1)


Использование root.setTop(null) - не лучшая идея, потому что, как вы говорите, это характерно для BorderPane.

Думаю, лучшим решением будет использовать:

root.getChildren().remove(yourPane);

И используйте методы компоновки, чтобы разместить других своих детей, как хотите. Но, возможно, вам не следует использовать BorderPane в первую очередь с тем поведением, которое вы хотите в своем приложении.

Обратите внимание, что вы также можете сделать root.getChildren().clear(), чтобы удалить все компоненты и снова добавить их в свой макет, но по-другому.

person Flo C    schedule 20.08.2013