From b62db18f0cb8a10a34405ffe222c547625e6c387 Mon Sep 17 00:00:00 2001 From: Marcus van Elst Date: Tue, 5 May 2026 15:39:27 +0200 Subject: [PATCH] =?UTF-8?q?Verschachtele=20runLater=20in=20applyZoom=20f?= =?UTF-8?q?=C3=BCr=20zentriertes=20Verhalten=20beim=20ersten=20Zoom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beim Verlassen des Fit-Modus (setFitToWidth(false)) löst JavaFX einen H/V-Reset auf 0.0 aus, der innerhalb desselben Pulses passiert wie unser setHvalue(0.5)-Aufruf im einfachen Platform.runLater. Resultat: Der Reset überschreibt unseren Wert, die PDF springt links/oben bündig. Lösung analog zu resetToFitView: doppelt verschachteltes runLater. Das erste runLater stößt den Layout-Pass nach setFitToWidth(false) an; das zweite feuert im darauffolgenden Pulse, wenn alle Layout-Folgen abgeschlossen sind und setHvalue(0.5)/setVvalue(0.5) zuverlässig wirken. Folge-Zoom-Schritte (wasInFitMode == false) bleiben mit einfachem runLater und bewahren die aktuelle Scroll-Position. Co-Authored-By: Claude Sonnet 4.6 --- .../in/gui/batchrun/PdfPreviewPane.java | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/PdfPreviewPane.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/PdfPreviewPane.java index f81a212..3eb9644 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/PdfPreviewPane.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/PdfPreviewPane.java @@ -722,21 +722,35 @@ public final class PdfPreviewPane { return; } - // Beim ersten Zoom Mitte beibehalten; danach aktuelle Position bewahren - double hval = wasInFitMode ? 0.5 : scrollPane.getHvalue(); - double vval = wasInFitMode ? 0.5 : scrollPane.getVvalue(); - zoomLevel = effective; imageView.setFitWidth(naturalViewportWidth * zoomLevel); imageView.setFitHeight(0); - // layout() stellt sicher, dass die neuen Inhaltsgrenzen bekannt sind, - // bevor die Scroll-Werte restauriert werden - Platform.runLater(() -> { - scrollPane.layout(); - scrollPane.setHvalue(hval); - scrollPane.setVvalue(vval); - }); + if (wasInFitMode) { + // Erster Zoom-Schritt nach Verlassen des Fit-Modus: doppelt + // verschachteltes runLater. Das erste runLater stößt den Layout-Pass + // nach setFitToWidth(false) an; das zweite feuert im darauffolgenden + // Pulse, wenn alle Layout-Folgen abgeschlossen sind. Andernfalls + // überschreibt der system-bedingte H/V-Reset auf 0.0 (ausgelöst durch + // setFitToWidth(false)) den setHvalue(0.5)-Aufruf, und die PDF + // springt links/oben bündig statt zentriert zu erscheinen. + Platform.runLater(() -> { + scrollPane.layout(); + Platform.runLater(() -> { + scrollPane.setHvalue(0.5); + scrollPane.setVvalue(0.5); + }); + }); + } else { + // Folge-Schritte: aktuelle Scroll-Position bewahren + double hval = scrollPane.getHvalue(); + double vval = scrollPane.getVvalue(); + Platform.runLater(() -> { + scrollPane.layout(); + scrollPane.setHvalue(hval); + scrollPane.setVvalue(vval); + }); + } } /**