【问题标题】:Drag and Drop svg file in a canvas在画布中拖放 svg 文件
【发布时间】:2016-07-17 04:08:36
【问题描述】:

我创建了一个编辑器,在其中显示一个画布。我想允许 svg 文件的 DnD。

事实是我允许使用这部分代码删除文件:

int operations = DND.DROP_COPY | DND.DROP_MOVE;
Transfer[] types = new Transfer[]{FileTransfer.getInstance()};

DropTarget dt = new DropTarget(parent, operations);
    dt.setTransfer(types);
    dt.addDropListener(new DropTargetAdapter() {
    public void drop(DropTargetEvent event) {
    //ToDo
    }

但它允许任何类型的文件,我只想要 .svg 文件。 我如何创建一个条件,它将检查删除的文件是否为 .svg 文件,如果是,则使用导入的文件创建一个新画布?

我也想恢复被删除文件的路径,知道我该怎么做吗?

我真的不知道如何将导入的文件限制为 svg。

【问题讨论】:

    标签: java canvas svg drag-and-drop swt


    【解决方案1】:

    假设您的所有文件都具有有效的.svg 扩展名,请检查适配器中的文件扩展名并仅使用具有正确扩展名的文件,而忽略具有其他扩展名的文件。

    然后对文件做你需要做的事情:

    public static void main(String[] args)
    {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setText("Stackoverflow");
        shell.setLayout(new FillLayout());
    
        Label label = new Label(shell, SWT.NONE);
    
        DropTarget target = new DropTarget(label, DND.DROP_DEFAULT | DND.DROP_MOVE | DND.DROP_COPY);
    
        Transfer[] transfers = new Transfer[]{FileTransfer.getInstance()};
    
        target.setTransfer(transfers);
        target.addDropListener(new DropTargetAdapter()
        {
            public void drop(DropTargetEvent event)
            {
                if (event.data == null)
                {
                    event.detail = DND.DROP_NONE;
                    return;
                }
    
                String[] paths = (String[]) event.data;
                List<File> files = new ArrayList<>();
    
                for (String path : paths)
                {
                    int index = path.lastIndexOf(".");
                    if (index != -1)
                    {
                        String extension = path.substring(index + 1);
                        if (Objects.equals(extension, "svg"))
                            files.add(new File(path));
                    }
                }
    
                System.out.println(files);
            }
        });
    
        shell.pack();
        shell.open();
        shell.setSize(400, 300);
    
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
    

    【讨论】:

    • 像魅力一样工作。非常感谢。我只是想知道是否有另一种解决方案,而不是浏览所有路径以检查扩展文件是否为 svg。
    • @Beginner 很高兴它对你有用。想不出没有循环的方法。随意等待,看看是否会弹出其他答案。如果没有,请考虑在某个时候接受我的回答。
    猜你喜欢
    • 2017-08-03
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2013-12-31
    • 2012-12-01
    • 2013-10-05
    相关资源
    最近更新 更多