JavaFX - setVisible verbirgt das Element, ordnet jedoch benachbarte Knoten nicht neu an


83

In JavaFX, wenn ich eine Szene mit 2 VBoxElementen habe und jedes VBoxmehrere enthält Label.
Wenn ich die Oberseite VBoxauf unsichtbar setze , warum VBox bewegt sich die Unterseite nicht in der Szene nach oben, in der sich die Oberseite VBoxbefand?

Das VBoxist unsichtbar, aber ich würde erwarten, dass sich die anderen Objekte an ihren Platz bewegen.

Ich verwende FXML, um meine Steuerelemente zu laden.


2
Weil der erste VBoxnur unsichtbar ist und nicht removedvon seinem Elternteil.
ItachiUchiha

1
Ob versteckte Knoten normalerweise Platz
beanspruchen

Antworten:


165

Node.setVisible(boolean)schaltet einfach den Sichtbarkeitsstatus von a um Node.

Um a Nodevon den übergeordneten Layoutberechnungen auszuschließen , müssen Sie zusätzlich den verwalteten Status durch Aufrufen festlegen Node.setManaged(false).

Wenn Sie möchten, dass der verwaltete Status neben der Sichtbarkeit automatisch aktualisiert wird, können Sie eine Bindung verwenden, wie in @jewelsea ausgeführt: node.managedProperty().bind(node.visibleProperty());


49
Eine Bindung funktioniert auch , zBnode.managedProperty().bind(node.visibleProperty());
Jewelsea

Das ist toll! Als ich von Adobe / Apache Flex kam, fehlte mir wirklich der IncludeInlayout-Schalter (der hier das Gleiche tut). Flex hat immer noch den intuitiveren Namen, aber es ist großartig, dass wir dies leicht tun können.
Benutzer

1
Sie haben viel zu lange unsichtbare Elemente von ihren Eltern entfernt, dies wird in Zukunft viel Zeit sparen.
Hanslovsky

7

Da es unsichtbar ist, bewegt es sich nicht nach oben. Sie müssen es mit etwas wie entfernen:

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

Sobald Sie das Element entfernt haben, das Sie unsichtbar machen möchten, sollte das andere Element nach oben verschoben werden.


3
AFAIK, das Manipulieren des Szenendiagramms ist teurer als das Setzen von sichtbar auf falsch.
Puce

2

Anstatt die vbox auszublenden, sollten Sie sie aus den untergeordneten Elementen entfernen und die vbox erneut hinzufügen, wenn Sie sie erneut anzeigen möchten.


1

Versuchen Sie, setVisible und manageProperty zusammen zu verwenden. Hier ist ein Beispiel:

myHBox.setVisible(false);
myHBox.managedProperty().bind(myHBox.visibleProperty());

1
nichts Neues im Vergleich zu der Antwort mit den meisten positiven Stimmen, gibt es :)
Kleopatra

0

Wenn ich einen Knoten ein- und ausblenden möchte, ändere ich die Größe des Knotens auf 0, wenn ich ihn ausblenden möchte. Auf diese Weise belegt der Knoten keinen Platz, da er für den Benutzer nicht sichtbar ist. Wenn ich also möchte, dass er sichtbar ist, passe ich die Größe erneut an, damit er sichtbar ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.