JavaFX 拖放:仅接受部分文件扩展名



我想做的:当用户尝试将某些内容拖放到窗口中时,只有当拖动具有扩展名(.mp3,.ogg,.wav)的文件时,他才能执行此操作。如果文件没有此扩展名,则无法进行删除。我不想要链接等...要掉落。

例如,只接受html是如此简单,就像:

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

如何为此添加过滤器?

可以使用DragBoardgetDragboardNodeScenesetOnDragOver的事件处理程序中DragEvent方法返回的getFiles方法来获取当前拖动的文件列表。

您可以检查此列表中的扩展名,例如使用Apache Commons IO的getExtension,或者通过实现自己的函数来获取文件的扩展名。如果拖板文件的扩展名与预定义的扩展名不匹配,您可以简单地使用DragEvent

在这个例子中,我创建了一个带有VBoxStage,它只接受扩展名为"jpg"和"png"的文件放在上面。如果删除成功,它将打印文件的绝对文件路径。

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