简体   繁体   English

javafx在MediaView中拖放音频或视频文件

[英]javafx Drag and Drop audio or video files in MediaView

I want to drag and drop audio file in MediaView. 我想在MediaView中拖放音频文件。 this is my code 这是我的代码

@FXML
private void initialize() {
    MediaView audioMediaView = new MediaView();
    EventHandler<DragEvent> dragOverHandler = event -> {
        Object gestSource = event.getGestureSource();
        DataFormat mimeAudio = new DataFormat("audio/*");
        DataFormat mimeVideo = new DataFormat("video/*");
        if ((gestSource != audioMediaView || gestSource != audioListView) &&
                (event.getDragboard().hasContent(mimeAudio) ||
                        event.getDragboard().hasContent(mimeVideo))) {
            event.acceptTransferModes(TransferMode.ANY);
            System.out.println("Drag Over");
        }
        event.consume();
    };
    EventHandler<DragEvent> dragDroppedHandler = event -> {
        try {
            Dragboard db = event.getDragboard();
            boolean success = false;
            DataFormat mimeAudio = new DataFormat("audio/*");
            DataFormat mimeVideo = new DataFormat("video/*");
            if (db.hasContent(mimeAudio) || db.hasContent(mimeVideo)) {
                File file = db.getFiles().get(0);
                javafx.scene.media.Media media = new javafx.scene.media.Media(file.toURI().toString());
                audioMediaView.setMediaPlayer(new MediaPlayer(media));
                success = true;
                System.out.println("Drag Dropped");
            }
            /* let the source know whether the string was successfully
             * transferred and used */
            event.setDropCompleted(success);
            event.consume();
        } catch (Exception e) {
            e.printStackTrace();
        }
    };
    //....other codes
    audioMediaView.setOnDragOver(dragOverHandler);
    audioMediaView.setOnDragDropped(dragDroppedHandler);
}

But i got this message when i drag an audio file 但是当我拖动音频文件时收到了此消息

Java Messsge:DataFormat 'audio/*' already exists.

Any suggestions? 有什么建议么? Is mime 'audio/*' or 'video/*' incorrect? 哑剧'audio/*''video/*'不正确? What can i code drag and drop only audio or video files? 我只能编码哪些音频或视频文件? Thanks and sorry for my english. 谢谢你,我的英语不好意思。

To get rid of error message you just need to put declaration of 要消除错误消息,您只需要声明

DataFormat mimeAudio = new DataFormat("audio/*");
DataFormat mimeVideo = new DataFormat("video/*");

outside of EventHandler s, but it seems to me not the right approach to this task. EventHandler之外,但是在我看来,执行此任务的方法不正确。 Instead of dealing with DataFormat you might simply check the file extension and if it's supported - do your staff with that file: 除了处理DataFormat您还可以简单地检查文件扩展名以及是否支持该文件扩展名-请您的员工处理该文件:

Set<String> acceptedExtensions = new HashSet<>(Arrays.asList("mp3", "wav", "avi"));
final EventHandler<DragEvent> dragOverHandler = event -> {
    Dragboard db = event.getDragboard();
    if (db.hasFiles()) {
        event.acceptTransferModes(TransferMode.ANY);
    }
    event.consume();
};
final EventHandler<DragEvent> dragDroppedHandler = event -> {
    Dragboard db = event.getDragboard();
    boolean success = false;
    if (db.hasFiles()) {
        success = true;
        File file = db.getFiles().iterator().next();
        final String extension = FilenameUtils.getExtension(file.getName());
        if (acceptedExtensions.contains(extension)) {
            Media media = new Media(file.toURI().toString());
            audioMediaView.setMediaPlayer(new MediaPlayer(media));
        }
        System.out.println("Drag Dropped");
    }
    event.setDropCompleted(success);
    event.consume();
};

Note, FilenameUtils class is coming from Apache 注意,FilenameUtils类来自Apache

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM