Verschachtele runLater in applyZoom für zentriertes Verhalten beim ersten Zoom

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 <noreply@anthropic.com>
This commit is contained in:
2026-05-05 15:39:27 +02:00
parent 3fb511601c
commit b62db18f0c
@@ -722,22 +722,36 @@ 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
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);
});
}
}
/**
* Setzt Zoom, Akkumulator und Pan-Zustand zurück und reaktiviert den Fit-to-View-Modus.