2016-06-22 4 views
2

私がやりたいこと: ユーザーが何かをドラッグアンドドロップしようとすると、ドラッグに拡張子が付いたファイル(.mp3 、.ogg、.wav)。ファイルにこの拡張子がない場合、ドロップはできません。リンクなどを削除したくありません。JavaFXドラッグアンドドロップ:いくつかのファイル拡張子のみを受け入れる

たとえばとしてのみHTMLはとても簡単です受け入れる:

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

     }); 

iはそのためのフィルタを追加できますか?

答えて

3

あなたは現在、ドラッグファイルのリストを得るためにあなたのNodeScenesetOnDragOverに設定されたイベントハンドラでDragEventgetDragboardメソッドによって返さDragBoardgetFiles方法を使用することができます。

getExtensionApache Commons IO)などの拡張子を確認することも、ファイルの拡張子を取得する独自の機能を実装することもできます。ドラッグボードのファイルの拡張子が定義済みの拡張子と一致しない場合、単にDragEventを使用することができます。この例では

私はそれにドロップされるように、「JPG」と「PNG」の拡張子を持つファイルのみを受け付ける内VBoxStageを作成しました。ドロップが成功した場合は、ファイルの絶対パスを表示します。

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

ニースの回答!私は非常に喜んでいると答えることができる場合、私は1つの同様の質問がありますhttp://stackoverflow.com/questions/37237837/get-javafx-drag-and-drop-target-folder – GOXR3PLUS

関連する問題