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:
+20
-6
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user