JavaFX - setVisible скрывает элемент, но не меняет порядок соседних узлов

86

В JavaFX, если у меня есть сцена с двумя VBoxэлементами, и в каждом VBoxесть несколько элементов Label.
Если я устанавливаю верх VBoxк невидимому , почему дну VBox не двигаться вверх сцена , где верх VBoxбыл?

VBoxЯвляется невидимым , но я бы ожидать , что другие объекты , чтобы переместить на место.

Я использую FXML для загрузки элементов управления.

Гиллардо
источник
2
Потому что первый VBoxпросто невидим, а не removedот своего родителя.
ItachiUchiha
1
занимают ли скрытые узлы какое-либо место или нет, обычно
решает

Ответы:

169

Node.setVisible(boolean)просто переключает состояние видимости Node.

Чтобы исключить a Nodeиз вычислений его родительского макета, вам дополнительно необходимо установить его управляемое состояние, вызвав Node.setManaged(false).

Если вы хотите, чтобы управляемое состояние обновлялось автоматически вместе с видимостью, вы можете использовать привязку, как указано в @jewelsea: node.managedProperty().bind(node.visibleProperty());

Eckig
источник
51
Связывания также работает , например,node.managedProperty().bind(node.visibleProperty());
jewelsea
7

Поскольку он невидим, он не переместится наверх. Вы должны удалить это примерно так:

// remove
vbox.getChildren().remove(...)

После того, как вы удалили элемент, который хотите сделать невидимым, другой элемент должен переместиться наверх.

остановка
источник
3
AFAIK, манипулирование графом сцены дороже, чем установка visible на false.
Puce
3

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

Juce
источник
1

Попробуйте использовать setVisible и managedProperty вместе. Вот пример:

myHBox.setVisible(false);
myHBox.managedProperty().bind(myHBox.visibleProperty());
Николеску Ионут Лучиан
источник
1
нет ничего нового по сравнению с ответом с наибольшим количеством голосов :)
kleopatra
0

Если я хочу скрыть и показать узел, я изменяю размер узла на 0, если я хочу его скрыть. Таким образом, узел не будет занимать место, поскольку он не виден пользователю, поэтому, когда я хочу, чтобы он был виден, я снова регулирую размер, чтобы он был видимым.

Evaboy
источник