From 7e31057bfa8d1eaef80270aa8e1506803cfce56b Mon Sep 17 00:00:00 2001 From: Marcus van Elst Date: Fri, 24 Apr 2026 13:30:53 +0200 Subject: [PATCH] Fix #27 und #29: Mausrad-Seitenwechsel und Seitenanfang in PDF-Vorschau Bug #27: ScrollEvent-Filter auf PDFView verhindert Seitenwechsel durch Mausrad. Seitenwechsel sind ausschliesslich ueber die Navigations-Buttons moeglich. Die Seitenzahl wird nur noch bei Button-Klick aktualisiert. Bug #29: Nach dem Laden einer PDF und bei Seitenwechsel ueber Buttons wird die Seite jetzt explizit von oben angezeigt. Der setPage()-Aufruf erfolgt via Platform.runLater() nach dem Layout-Pass, sodass stets der Seitenanfang sichtbar ist. Co-Authored-By: Claude Sonnet 4.6 --- .../adapter/in/gui/batchrun/PdfPreviewPane.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 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 7975cf8..fbe4526 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 @@ -13,6 +13,7 @@ import com.dlsc.pdfviewfx.PDFView; import javafx.application.Platform; import javafx.geometry.Insets; import javafx.geometry.Pos; +import javafx.scene.input.ScrollEvent; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ProgressIndicator; @@ -104,6 +105,11 @@ public final class PdfPreviewPane { pdfView.setShowToolBar(false); pdfView.setId("pdf-preview-view"); + // Bug #27: Mausrad-Scrollevents abfangen, damit PDFView keinen Seitenwechsel auslöst. + // Das Mausrad soll ausschließlich innerhalb der aktuellen Seite scrollen. + // Seitenwechsel sind nur über die Navigations-Buttons erlaubt. + pdfView.addEventFilter(ScrollEvent.SCROLL, ScrollEvent::consume); + overlayLabel.setId("pdf-preview-overlay-label"); overlayLabel.setStyle("-fx-text-fill: #555555;"); overlayLabel.setWrapText(true); @@ -240,11 +246,11 @@ public final class PdfPreviewPane { return; } int targetPage = currentPage - 1; - // PDFView navigiert intern zur vorherigen Seite (0-basiert) - pdfView.setPage(targetPage - 1); currentPage = targetPage; updatePageLabel(); updateNavigationButtons(); + // Bug #29: Seite nach dem Layout-Pass von oben anzeigen (0-basierter Index) + Platform.runLater(() -> pdfView.setPage(targetPage - 1)); } private void navigateToNextPage() { @@ -252,10 +258,11 @@ public final class PdfPreviewPane { return; } int targetPage = currentPage + 1; - pdfView.setPage(targetPage - 1); currentPage = targetPage; updatePageLabel(); updateNavigationButtons(); + // Bug #29: Seite nach dem Layout-Pass von oben anzeigen (0-basierter Index) + Platform.runLater(() -> pdfView.setPage(targetPage - 1)); } // --- Asynchrones Laden --------------------------------------------------- @@ -314,6 +321,8 @@ public final class PdfPreviewPane { showContent(); updateNavigationButtons(); updatePageLabel(); + // Bug #29: Zum Seitenanfang scrollen, nachdem der Layout-Pass abgeschlossen ist + Platform.runLater(() -> pdfView.setPage(0)); LOG.debug("PDF-Vorschau: Rendering erfolgreich – {} Seite(n)", totalPages); } catch (Exception e) { String msg = classifyLoadException(e);