【问题标题】:JavaFX Drag and Drop: accept only some file extensionsJavaFX 拖放:仅接受某些文件扩展名
【发布时间】:2016-06-22 08:19:23
【问题描述】:
我想做什么:
当用户尝试将某些东西拖放到窗口中时,只有当拖动文件具有扩展名(.mp3、.ogg、.wav)时,他才能执行此操作。如果文件没有此扩展名,则无法完成拖放.我不希望链接等...被丢弃。
例如只接受 html 就这么简单:
controller.setOnDragOver((over) -> {
Dragboard board = over.getDragboard();
if (board.hasHtml())
over.acceptTransferModes(TransferMode.LINK);
});
我怎样才能为此添加过滤器?
【问题讨论】:
标签:
java
javafx
drag-and-drop
【解决方案1】:
您可以在Node或Scene的setOnDragOver中设置的事件处理程序中使用DragEvent的getDragboard方法返回的DragBoard的DragBoard方法获取当前文件列表被拖了。
您可以使用例如getExtension 或Apache Commons IO 或通过实现您自己的函数来获取文件的扩展名来检查此列表中的扩展名。如果拖动板文件的扩展名与预定义的扩展名不匹配,您可以简单地使用DragEvent。
示例
在这个例子中,我创建了一个Stage,里面有一个VBox,它只接受扩展名为“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);
}
}