Wie man die Höhe oder bevorzugte Höhe eines Knotens in JavaFX erhält, habe ich 3 VBox
und ich möchte Knoten zu dem freieren Panel hinzufügen, Beispiel:
In diesem Fall ist die VBoxB
am freiesten, ich berechne mit dieser Methode den freiesten Bereich:
Diese Methode funktioniert nur, wenn ich zu der Zeit 1 Element hinzufüge. Aber wenn ich zu der Zeit mehr Elemente hinzufüge:
%Vor% Die Methode getFreerColumnIndex
gibt denselben Index zurück. Das liegt daran, dass die neuen Knoten noch nicht lokal sind.
Also diese Zeile:
gibt 0
mit den neuen Knoten zurück.
Weiß jemand, wie man die Höhe eines Knotens erreicht?
SomeNode
erstreckt sich von Node
Methode addElement () bei myPane:
%Vor%Angenommen, wir haben 3 vbox: Vorher:
%Vor%Ausführen:
%Vor%Nachher:
%Vor%Korrigieren :
%Vor% |
= Ein Knoten
Was Sie tun müssen, ist:
applyCss()
und layout()
für jeden der Knoten (oder den Dummy-Stamm) auf. Verwandte
Um herauszufinden, wie man die Größe eines Knotens misst, siehe die Antwort auf:
Hintergrund
JavaFX-Layoutberechnungen funktionieren mit CSS und einem Layout-Durchlauf. Normalerweise geschieht dies als Teil eines Impulses (eine Art automatisierter 60fps-Tick im internen JavaFX-System, der nach irgendwelchen schmutzigen Objekten in der Szene sucht, die eine neue CSS oder ein neues Layout benötigen). In den meisten Fällen können Sie einfach die Änderungen angeben, die Sie an die Szene anpassen möchten, und der automatische Impulslayout-Mechanismus kann das Layout zu diesem Zeitpunkt übernehmen. Dies ist ziemlich effizient, da es bedeutet, dass alle Änderungen zwischen einem Impuls zusammengefasst werden und Sie keine Layout-Pässe manuell auslösen müssen. Wenn Sie jedoch tatsächlich die Größe der Objekte ermitteln müssen, bevor das Layout auftritt (wie in Ihrem Fall), müssen Sie die CSS-Anwendung und den Layout-Durchlauf manuell auslösen, bevor Sie versuchen, die Höhe und Breite des Knotens abzufragen / p>
Dokumentation
Leider das detaillierte Java 8u20 Javadoc für die node.applyCSS()
Die Methode ist derzeit nicht verfügbar, daher werde ich das Beispiel, das sich im Javadoc-Code befindet, reproduzieren, damit Sie die empfohlene Verwendung im Kontext sehen können. Für die nächste Java-Feature-Version (8u40) wird das defekte Javadoc als Teil von behoben. RT-38330 Javadoc fehlt für mehrere Methoden der Node-Klasse , so dass Sie mit dieser Version den folgenden Text in JavaFX javadoc finden können:
Falls erforderlich, wenden Sie Stile auf diesen Knoten und seine untergeordneten Elemente an, falls vorhanden. Diese Methode muss normalerweise nicht kann direkt aufgerufen werden, kann aber in Verbindung mit
layout()
verwendet werden, um einen Knoten vor dem nächster Impuls oder wenn die Szene nicht in einer Bühne ist.Sofern die Szene des Knotens nicht null ist, wird CSS trotzdem auf diesen Knoten angewendet ob der CSS-Status dieses Knotens sauber ist. CSS-Stile werden vom obersten übergeordneten Element angewendet dieses Knotens, dessen CSS-Status nicht sauber ist, was das Styling anderer Knoten beeinflussen kann. Diese Methode ist keine Operation, wenn sich der Knoten nicht in einer Szene befindet. Die Szene muss nicht auf einer Bühne sein.
Diese Methode ruft nicht die Methode
%Vor%layout()
auf. In der Regel verwendet der Anrufer die folgende Abfolge von Operationen.Als ein vollständigeres Beispiel verwendet der folgende Code
%Vor%applyCss()
undlayout()
, um zu finden Die Breite und Höhe des Buttons vor der Bühne wurde angezeigt. Wenn der Aufruf vonapplyCss()
oder der Aufruf vonlayout()
ist auskommentiert, die Aufrufe vongetWidth()
undgetHeight()
gibt Null zurück (bis einige Zeit nach der Stage angezeigt wird).
Alternative
Die andere Option besteht darin, die layoutChildren()
zu überschreiben Methode eines Parent-Knotens, der "während des Layout-Durchlaufs aufgerufen wird, um die untergeordneten Elemente in diesem Parent anzuordnen". Es kann auch notwendig sein, Methoden auf computePrefHeight()
sowie andere Berechnungsmethoden für prefWidth und min & amp; maximale Höhe & amp; Breite. Eine detaillierte Beschreibung der Verwendung dieses Ansatzes ist kompliziert und liegt außerhalb des Umfangs dieser Antwort.