Ermittelt die Höhe eines Knotens in JavaFX (generiert einen Layout-Durchlauf)

9

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:

%Vor%

In diesem Fall ist die VBoxB am freiesten, ich berechne mit dieser Methode den freiesten Bereich:

%Vor%

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:

%Vor%

gibt 0 mit den neuen Knoten zurück.

Weiß jemand, wie man die Höhe eines Knotens erreicht?

Extra:

SomeNode erstreckt sich von Node

Methode addElement () bei myPane:

%Vor%

Extra 2:

Angenommen, wir haben 3 vbox: Vorher:

%Vor%

Ausführen:

%Vor%

Nachher: ​​

%Vor%

Korrigieren :

%Vor%

| = Ein Knoten

    
iconer 02.10.2014, 00:10
quelle

1 Antwort

15

Was Sie tun müssen, ist:

  1. Erstellen Sie die Knoten, die in den VBoxen platziert werden sollen.
  2. Fügen Sie sie zu einer Szene hinzu (es kann nur eine neue Dummyszene sein, die nicht an der Bühne hängt, aber die gleichen CSS-Regeln wie Ihre Hauptszene hat).
  3. Rufen Sie applyCss() und layout() für jeden der Knoten (oder den Dummy-Stamm) auf.
  4. Messen Sie die Layoutgrenzen der einzelnen Knoten.
  5. Fügen Sie die Knoten den VBoxen in Ihrer realen Szene entsprechend Ihrem Layoutalgorithmus hinzu.

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 layout() auf. In der Regel verwendet der Anrufer die   folgende Abfolge von Operationen.

%Vor%      

Als ein vollständigeres Beispiel verwendet der folgende Code applyCss() und layout() , um zu finden   Die Breite und Höhe des Buttons vor der Bühne wurde angezeigt. Wenn der Aufruf von applyCss()   oder der Aufruf von layout() ist auskommentiert, die Aufrufe von getWidth() und getHeight()   gibt Null zurück (bis einige Zeit nach der Stage angezeigt wird).

%Vor%

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.

    
jewelsea 02.10.2014, 00:49
quelle

Tags und Links