2016-06-22 12 views
2

Was ich tun möchte: Wenn der Benutzer versucht, etwas in das Fenster zu ziehen und ablegen, kann er es nur tun, wenn die Datei mit Erweiterungen (.mp3 , .ogg, .wav) .Wenn die Dateien nicht diese Erweiterung haben, kann das Löschen nicht durchgeführt werden. Ich möchte nicht, dass Links usw. gelöscht werden.JavaFX Drag & Drop: nur einige Dateierweiterungen akzeptieren

Zum Beispiel akzeptieren nur html so einfach ist, wie:

controller.setOnDragOver((over) -> { 
      Dragboard board = over.getDragboard(); 
      if (board.hasHtml()) 
       over.acceptTransferModes(TransferMode.LINK); 

     }); 

Wie kann ich einen Filter für das hinzufügen?

Antwort

3

können Sie die getFiles Methode der DragBoard durch getDragboard Verfahren von DragEvent im Ereignishandler in setOnDragOver Ihre Node oder Scene zurückgegeben verwenden, um die Liste der Dateien zur Zeit gezogen zu bekommen.

Sie können die Erweiterungen in dieser Liste entweder mit getExtension von Apache Commons IO überprüfen oder indem Sie eine eigene Funktion implementieren, um die Erweiterung einer Datei zu erhalten. Wenn die Erweiterung (en) der Datei (en) des Dagboards nicht mit den vordefinierten Erweiterungen übereinstimmen, können Sie einfach DragEvent konsumieren.

Beispiel

In diesem Beispiel habe ich eine Stage mit einem VBox innerhalb dessen Dateien akzeptiert nur mit Erweiterung „jpg“ und „png“ fallen gelassen werden auf sie erstellt. Wenn der Abbruch erfolgreich war, druckt er den absoluten Dateipfad der Dateien.

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
      VBox root = new VBox(); 
      Scene scene = new Scene(root,400,400); 

      // Extensions that are valid to be drag-n-dropped 
      List<String> validExtensions = Arrays.asList("jpg", "png"); 

      root.setOnDragOver(event -> { 
       // On drag over if the DragBoard has files 
       if (event.getGestureSource() != root && event.getDragboard().hasFiles()) { 
        // All files on the dragboard must have an accepted extension 
        if (!validExtensions.containsAll(
          event.getDragboard().getFiles().stream() 
            .map(file -> getExtension(file.getName())) 
            .collect(Collectors.toList()))) { 

         event.consume(); 
         return; 
        } 

        // Allow for both copying and moving 
        event.acceptTransferModes(TransferMode.COPY_OR_MOVE); 
       } 
       event.consume(); 
      }); 

      root.setOnDragDropped(event -> { 
       boolean success = false; 
       if (event.getGestureSource() != root && event.getDragboard().hasFiles()) { 
        // Print files 
        event.getDragboard().getFiles().forEach(file -> System.out.println(file.getAbsolutePath())); 
        success = true; 
       } 
       event.setDropCompleted(success); 
       event.consume(); 
      }); 

      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // Method to to get extension of a file 
    private String getExtension(String fileName){ 
     String extension = ""; 

     int i = fileName.lastIndexOf('.'); 
     if (i > 0 && i < fileName.length() - 1) //if the name is not empty 
      return fileName.substring(i + 1).toLowerCase(); 

     return extension; 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Schöne Antwort! Ich habe eine ähnliche Frage, wenn Sie antworten können, dass ich sehr froh bin http://stackoverflow.com/questions/37237837/get-javafx-drag-and-drop-target-folder – GOXR3PLUS