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;
|
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;
|
zoomLevel = effective;
|
||||||
imageView.setFitWidth(naturalViewportWidth * zoomLevel);
|
imageView.setFitWidth(naturalViewportWidth * zoomLevel);
|
||||||
imageView.setFitHeight(0);
|
imageView.setFitHeight(0);
|
||||||
|
|
||||||
// layout() stellt sicher, dass die neuen Inhaltsgrenzen bekannt sind,
|
if (wasInFitMode) {
|
||||||
// bevor die Scroll-Werte restauriert werden
|
// 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(() -> {
|
Platform.runLater(() -> {
|
||||||
scrollPane.layout();
|
scrollPane.layout();
|
||||||
scrollPane.setHvalue(hval);
|
scrollPane.setHvalue(hval);
|
||||||
scrollPane.setVvalue(vval);
|
scrollPane.setVvalue(vval);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setzt Zoom, Akkumulator und Pan-Zustand zurück und reaktiviert den Fit-to-View-Modus.
|
* Setzt Zoom, Akkumulator und Pan-Zustand zurück und reaktiviert den Fit-to-View-Modus.
|
||||||
|
|||||||
Reference in New Issue
Block a user