javafx Перетаскивание аудио или видео файлов в MediaView

Я хочу перетащить аудио-файл в 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/*' неправильно? Что я могу код перетаскивать только аудио или видео файлы? Спасибо и извините за мой английский.

1 ответ

Чтобы избавиться от сообщения об ошибке, вам просто нужно поместить объявление

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

вне EventHandlerс, но мне кажется, не правильный подход к этой задаче. Вместо того, чтобы иметь дело с 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

Другие вопросы по тегам