diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/FileNameEditorPane.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/FileNameEditorPane.java index 1fe943d..cd548df 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/FileNameEditorPane.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/FileNameEditorPane.java @@ -252,6 +252,19 @@ public final class FileNameEditorPane { return !current.equals(saved); } + /** + * Setzt den Dirty-State zurück, ohne das Textfeld neu zu laden. Wird aufgerufen, + * nachdem eine Umbenennung erfolgreich abgeschlossen wurde, damit ein anschließendes + * Ersetzen der Tabellenzeile keinen Verwerfen-Dialog auslöst. Der angezeigte Text + * im Textfeld bleibt unverändert; {@code lastSavedName} wird auf den aktuellen + * Textfeldinhalt gesetzt. + */ + public void clearDirtyState() { + String current = textField.getText() == null ? "" : textField.getText(); + this.lastSavedName = current.isBlank() ? Optional.empty() : Optional.of(current); + refreshUiState(); + } + /** * Liefert {@code true} wenn für die aktuelle Zeile ein KI-Vorschlag vorliegt. * diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunTab.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunTab.java index af9523b..f2cb44e 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunTab.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunTab.java @@ -792,6 +792,10 @@ public final class GuiBatchRunTab { row.processingDuration(), row.resetPending()); currentlySelectedRow = updatedRow; + // Dirty-State vor dem Zeilen-Upsert zurücksetzen, damit das folgende + // resultItems.set() keinen Verwerfen-Dialog über den selectedItemProperty-Listener + // auslöst (isDirty() wäre sonst noch true, obwohl die Umbenennung erfolgreich war). + fileNameEditor.clearDirtyState(); upsertResultRowByFingerprint(updatedRow); // Editor-Zustand auf neuen Namen zurücksetzen String targetFolder = targetFolderSupplier.get().orElse(""); @@ -1114,7 +1118,15 @@ public final class GuiBatchRunTab { void upsertResultRowByFingerprint(GuiBatchRunResultRow newRow) { for (int i = 0; i < resultItems.size(); i++) { if (resultItems.get(i).fingerprint().equals(newRow.fingerprint())) { - resultItems.set(i, newRow); + // resultItems.set() feuert selectedItemProperty mehrfach (JavaFX-intern: + // oldRow → null → newRow), was ohne diesen Schutz handleSelectionChange() + // und damit fälschlicherweise den Verwerfen-Dialog auslösen würde. + selectionSyncInProgress = true; + try { + resultItems.set(i, newRow); + } finally { + selectionSyncInProgress = false; + } // Falls die aktuell selektierte Zeile aktualisiert wurde, Referenz erneuern if (currentlySelectedRow != null && currentlySelectedRow.fingerprint().equals(newRow.fingerprint())) {