Node.snapshot (null, null) ändert die Größe der Szene

9

Ich habe Scene , das auf Scene meiner primaryStage gesetzt ist, das - neben anderen Knoten - ein VBox mit einem TableView und einige Buttons enthält. Wenn ich eine Momentaufnahme für eine Zeile in der Tabelle mit TableRow.snapshot(null, null) anwende, wird die Größe von Scene geändert. Die Breite wird um etwa 10 Pixel geändert, während die Höhe um etwa 40 - manchmal mehr als 600 (!) - Pixel geändert wird.

Dies geschieht, weil Node.snapshot(null, null) Scene.doCSSLayoutSyncForSnapshot(Node node) aufruft, das die bevorzugte Größe aller Knoten in der Größe zu erhalten scheint und die Größe mit dieser neu berechnet. Dies gibt irgendwie die falschen Werte zurück, da meine Knoten nur bevorzugte Größen haben und groß aussehen, bevor diese Methode aufgerufen wird. Gibt es eine Möglichkeit, dies zu verhindern?

Die Änderung der Größe ist ein Problem, aber es ist auch ein Problem, dass die Primärstufe die Größe nicht mit der darin enthaltenen Scene ändert.

Ich habe versucht, ein MCVE zu erstellen, das das Problem reproduziert, aber nach ein paar Tagen, in denen ich das versucht habe, kann ich das Problem nicht reproduzieren. Das ursprüngliche Programm enthält etwa 2000 Codezeilen, die ich hier nicht posten möchte.

Warum würde Scene.doCSSLayoutSyncForSnapshot(Node node) mein Layout kompromittieren, wenn es richtig angelegt ist? Kann ich irgendwie sicherstellen, dass das Layout richtig synchronisiert ist, bevor diese Methode aufgerufen wird, um sicherzustellen, dass nichts geändert wird?

    
Jonatan Stenbacka 19.05.2016, 09:20
quelle

1 Antwort

1

Das Problem wurde gelöst. Ich musste mein gesamtes Projekt kopieren und dann Teile des Codes entfernen, bis das Problem verschwunden war.

Wie auch immer. Ich hatte im Grunde drei Komponenten in meiner Anwendung. Eine Navigationskomponente, eine Tabellenkomponente und eine Statusleistenkomponente. Es sah so aus:

Das Problem, das ich hatte, war, dass die Breite der Statusleiste und die Breite und Höhe der Tabellenkomponente erhöht wurde, wenn ich eine Momentaufnahme einer Zeile in der Tabelle machte.

Offenbar war dies auf das Auffüllen der Statusleistenkomponente zurückzuführen. Es hatte eine rechte und linke Auffüllung von 5 Pixeln, und sobald ich die Auffüllung entfernte, verschwand das Problem.

Die hinzugefügten 10 Pixel in der Breite ließen die BorderPane , die all dies enthielt, mit der gleichen Anzahl von Pixeln expandieren, und da die Tischbreite an die BorderPane Breite gebunden war, erhöhte sie sich um den gleichen Betrag. Was ich aber immer noch nicht verstehe ist, warum sich die Stage , die die BorderPane enthält, nicht an die neue Breite anpasst.

Die Komponente wurde richtig aufgefüllt, bevor Scene.doCSSLayoutSyncForSnapshot(Node node) aufgerufen wurde. Daher verstehe ich nicht, warum die zusätzliche Breite von zehn Pixeln hinzugefügt wird.

Jedenfalls: Das Entfernen der Auffüllung aus der Statusleistenkomponente und das Auffüllen der Komponenten in der Statusleiste haben das Problem behoben. Wenn jemand eine gute Erklärung dafür hat, bin ich ganz Ohr.

Hier ist ein MCVE, in dem Sie das Problem reproduzieren können, indem Sie eine Zeile in der Tabelle ziehen:

%Vor%     
Jonatan Stenbacka 04.08.2016, 11:06
quelle

Tags und Links