nach Image Load in ListView, kann Ordner nicht mehr gelöscht werden

Ingerten

Bekanntes Mitglied
Hallo Männers, ich brauche mal hilfe.

Ich bin grade dabei ein Programm zu schreiben, wo ich JPGs aus einem Ordner anzeigen lassen kann und das adde ich in eine ListView, wenn die JPGs im Ordner nicht mehr gebraucht werden, soll man den ganzen Ordner löschen können, aber das geht nicht.

Wenn ich die ListView gefüllt habe kann ich den Ordner nicht mehr löschen.

Die Ordnerstruktur sieht oft so aus.

- Ordner 1
--- Ordner 11
----- 1.jpg
----- 2.jpg
--- Ordner 12
----- 1.jpg
----- 2.jpg

- Ordner 2
--- Ordner 21
----- 1.jpg
----- 2.jpg

In "Ordner 1" z.B. können auch noch viel mehr Unterordner sein und wenn die JPGs nicht mehr gebraucht werden, dann soll der "Ordner 1" gelöscht werden.

Aber das klappt eben nicht und ich weiss langsam nicht mehr weiter, wie ich die JPGs unlocked bekommen soll.

HILFE, bitte!!!

Hier mal ein Beispiel, was ich schnell geschrieben habe.

Java:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;

public class ListViewImageBrowser extends Application {
   
    File saveFile;

    @Override
    public void start(Stage primaryStage) {
        ObservableList<Path> imageFiles = FXCollections.observableArrayList();

        TextField directoryField = new TextField();
        directoryField.setPrefWidth(600);
        Button browseButton = new Button("Browse");
        Button loadButton = new Button("Load");    
        loadButton.setPrefWidth(50);
       
        TextField directoryFieldDel = new TextField();
        directoryFieldDel.setPrefWidth(600);
        Button delBrowseButton = new Button("Browse");
        Button delButton = new Button("Delete");      
          
        EventHandler<ActionEvent> loadHandler = event -> imageFiles.setAll(load(Paths.get(directoryField.getText())));
        loadButton.setOnAction(loadHandler);
        directoryField.setOnAction(loadHandler);

        browseButton.setOnAction(event -> {
            DirectoryChooser chooser = new DirectoryChooser();
            File file = chooser.showDialog(primaryStage);
            if (file != null) {
                directoryField.setText(file.toString());
                imageFiles.setAll(load(file.toPath()));
            }
        });

       
         delButton.setOnAction(event -> {          
            del(saveFile.getParentFile());
        });
       
        delBrowseButton.setOnAction(event -> {
            DirectoryChooser chooser = new DirectoryChooser();
            File file = chooser.showDialog(primaryStage);
            saveFile = file;
            if (file != null) {
                directoryFieldDel.setText(file.toString());              
            }
        });
       
        HBox controls = new HBox(directoryField, browseButton, loadButton);
        controls.setAlignment(Pos.CENTER);
        controls.setSpacing(5);

       
        HBox controls2 = new HBox(directoryFieldDel, delBrowseButton, delButton);
        controls2.setAlignment(Pos.CENTER);
        controls2.setSpacing(5);

        VBox vBox = new VBox(controls, controls2);
        vBox.setSpacing(5);
       
        ListView<Path> imageFilesList = new ListView<>(imageFiles);
        imageFilesList.setCellFactory(listView -> new ListCell<Path>() {
            private final ImageView imageView = new ImageView();
            {
                imageView.setFitHeight(80);
                imageView.setFitWidth(160);
                imageView.setPreserveRatio(true);
            }
            @Override
            public void updateItem(Path path, boolean empty) {
                super.updateItem(path, empty);
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {
                    setText(path.getFileName().toString());
                    imageView.setImage(new Image(path.toUri().toString(), true));
                    setGraphic(imageView);
                }
            }
        });

        ImageView imageView = new ImageView();
        imageFilesList.getSelectionModel().selectedItemProperty().addListener((obs, oldFile, newFile) -> {
            if (newFile == null) {
                imageView.setImage(null);
            } else {
                imageView.setImage(new Image(newFile.toUri().toString(), true));
            }
        });
        imageFilesList.setMinWidth(200);

        StackPane imageHolder = new StackPane(imageView);
        imageView.fitWidthProperty().bind(imageHolder.widthProperty());
        imageView.fitHeightProperty().bind(imageHolder.heightProperty());
        imageView.setPreserveRatio(true);

        BorderPane root = new BorderPane(imageHolder, vBox, null, null, imageFilesList);

        Scene scene = new Scene(root, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
   
    public boolean del(File dir){
       
        if (dir.isDirectory()){
           
            File[] files = dir.listFiles();
           
            for (File aktFile: files){
                del(aktFile);
            }
        }
       
        return dir.delete();
    }

    private List<Path> load(Path directory) {
        List<Path> files = new ArrayList<>();
        try {
            Files.newDirectoryStream(directory, "*.{jpg,jpeg,png,JPG,JPEG,PNG}").forEach(file -> files.add(file));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return files ;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 
OK, ich habe den Problem lösen können.

Die Methode "private List<Path> load(Path directory)" war nicht ganz richtig.

Richtig ist:
Java:
    private List<Path> load(Path directory) {
            List<Path> files = new ArrayList<>();       
            DirectoryStream<Path> fileStream = null;
           
            try {
                fileStream = Files.newDirectoryStream(directory, "*.{jpg,jpeg,png,JPG,JPEG,PNG}");
                fileStream.forEach(file -> files.add(file));
                fileStream.close();
               
            } catch (IOException e) {
                e.printStackTrace();
            }
            return files;           
        }
 

Zurück
Oben