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