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


86

У JavaFX, якщо я маю сцену з 2 VBoxелементами, і в кожному VBoxє кілька Label.
Якщо я встановив верхній VBoxна невидимий , чому нижній VBox не рухається вгору по сцені, де VBoxбув верхній ?

VBoxЄ невидимим , але я б очікувати , що інші об'єкти , щоб перемістити на місце.

Я використовую FXML для завантаження елементів керування.


2
Тому що перший VBoxпросто невидимий, а не removedвід батьків.
ItachiUchiha

1
чи займають приховані вузли якийсь простір, як правило, рішення макета
kleopatra

Відповіді:


169

Node.setVisible(boolean)просто перемикає стан видимості Node.

Щоб виключити Nodeз батьківських розрахунків макета, додатково потрібно встановити його керований стан, зателефонувавши Node.setManaged(false).

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


51
Зв'язування також працює , наприклад,node.managedProperty().bind(node.visibleProperty());
jewelsea

7

Оскільки він невидимий, він не рухатиметься до вершини. Ви повинні видалити його чимось на зразок:

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

Після того, як ви видалите елемент, який ви хочете побачити, тоді інший елемент повинен переміститися вгору.


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

3

Замість того, щоб приховувати vbox, вам слід видалити його з Дочірніх, а якщо ви хочете показати його знову, додайте vbox знову.



0

Якщо я хочу приховати і показати вузол, я зменшую розмір вузла до 0, якщо хочу його приховати. Таким чином, вузол не займе місця, оскільки не видно користувачеві, тому, коли я хочу, щоб він був видимим, l знову налаштуйте розмір, щоб він був видимим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.