JavaFX 拖放 : accept only some file extensions

标签 java javafx drag-and-drop

我想做什么: 当用户试图将某些东西拖放到窗口中时,只有当拖放的文件具有扩展名(.mp3、.ogg、.wav)时,他才能执行此操作。如果文件没有此扩展名,则无法完成拖放.我不想删除链接等。

例如只接受 html 就这么简单:

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

        });

我如何为它添加过滤器?

最佳答案

您可以使用 getFiles getDragboard 返回的 DragBoard 方法setOnDragOver 中设置的事件处理程序中的 DragEvent 方法您的 NodeScene 以获取当前拖动的文件列表。

您可以使用例如 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);
    }
}

关于JavaFX 拖放 : accept only some file extensions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37962364/

相关文章:

java - 如何使用 webdriver 增加 HTML 表格列宽

JavaFX 列表就像 SceneBuilder 中的库一样

java - JavaFX音乐

javascript - 如何判断某个元素是否正在使用 jQuery 进行拖动?

java - 如何从 HashMap 中删除值?

java - Elasticsearch 5 如何开始编写原生 Java 插件

java - libGDX 中奇怪的 PolyBatch 定位

JavaFX : Draw on Center Pane based on user input in Left Pane

python - 在 Qt 中仅从 Outlook 拖放一个附件?

c# - DragDropEffects.Copy 和 DragDropEffects.Move 有什么区别?