在画布中拖放svg文件

时间:2016-03-29 14:21:22

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

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

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

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。

1 个答案:

答案 0 :(得分:2)

假设您的所有文件都有一个有效的.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();
}