JavaFX - setVisible ukrywa element, ale nie zmienia kolejności sąsiednich węzłów


86

W JavaFX, jeśli mam scenę z 2 VBoxelementami i każdy z nich VBoxma wiele Label.
Jeśli ustawię górę VBoxjako niewidoczną , dlaczego dół VBox nie przesuwa się w górę sceny, w której VBoxznajdowała się góra ?

VBoxJest niewidoczny , ale spodziewałbym inne obiekty, aby przenieść się na swoim miejscu.

Używam FXML do ładowania moich formantów.


2
Ponieważ pierwsza VBoxjest po prostu niewidoczna i nie removedpochodzi od rodzica.
ItachiUchiha

1
to, czy ukryte węzły zajmują jakąkolwiek przestrzeń, zazwyczaj zależy od układu
kleopatra

Odpowiedzi:


168

Node.setVisible(boolean)po prostu przełącza stan widoczności pliku Node.

Aby wykluczyć a Nodez obliczeń układu nadrzędnego, musisz dodatkowo ustawić stan zarządzany przez wywołanie Node.setManaged(false).

Jeśli chcesz, aby zarządzany stan był aktualizowany automatycznie wraz z widocznością, możesz użyć wiązania, jak wskazał @jewelsea: node.managedProperty().bind(node.visibleProperty());


50
Wiążący również prace , na przykładnode.managedProperty().bind(node.visibleProperty());
jewelsea

7

Ponieważ jest niewidoczny, nie przesunie się na górę. Musisz go usunąć za pomocą czegoś takiego:

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

Po usunięciu elementu, który chcesz ukryć, drugi element powinien przesunąć się na górę.


3
AFAIK, manipulowanie wykresem sceny jest droższe niż ustawienie widoczne na fałsz.
Puce

3

Zamiast ukrywać vbox, powinieneś usunąć go z Children i jeśli chcesz go ponownie pokazać, dodaj ponownie vbox.



0

Jeśli chcę ukryć i odkryć węzeł, zmieniam rozmiar węzła na 0, jeśli chcę go ukryć. W ten sposób węzeł nie będzie zajmował miejsca, ponieważ nie jest widoczny dla użytkownika, więc jeśli chcę, aby był widoczny, ponownie dostosuj rozmiar, aby był widoczny.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.