0

我想在 MediaView 中拖放音频文件。这是我的代码

@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);
}

但是当我拖动音频文件时收到此消息

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

有什么建议么?是哑剧'audio/*'还是'video/*'不正确?我可以对仅拖放音频或视频文件进行编码吗?谢谢和对不起我的英语。

4

1 回答 1

0

要摆脱错误消息,您只需要声明

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

EventHandlers 之外,但在我看来,这不是完成这项任务的正确方法。与其与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();
};

注意,FilenameUtils 类来自 Apache

于 2018-07-22T17:59:58.913 回答