为什么我不能从Windows中的CD上删除文件到Eclipse/SWT Drop Target

Lin*_*k19 6 java eclipse windows swt drag-and-drop

在我的Eclipse RCP应用程序中,我有一个TreeViewer,它是文件的放置目标,它在大多数情况下工作正常,但是当我尝试将存储在CD ROM上的文件从Windows资源管理器拖到节点时,指示丢弃的图标是允许的改变和放弃什么都不做.

由于人们似乎对我的问题感到困惑,这里有一个更详细的解释:

当执行下面的代码(由Baz提供)时,我能够拖动文件并将它们放到文本框中,当我从我的机器上的大多数位置拖动文件时,窗口显示如下 - >

工作拖动

光标表示我可以丢弃,当我释放鼠标时,drop(DropTargetEvent event)调用该方法.

现在,当我做同样的事情,但从我的光驱中的DVD上的资源管理器中获取文件时,它看起来像这样:

在此输入图像描述

指示不允许丢弃,并且当我释放鼠标时,drop(DropTargetEvent event)不调用该方法.

还值得注意的是,我能够将相同的DVD文件放入eclipse导航器中的文件夹中,表明这不是机器特定的问题,在日食树中必须有不同的东西允许它,但我可以'看到了.

package widgets;

import java.util.Arrays;

import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.PluginTransfer;

public class SourceTest {
    public static void main(String[] args) {
        final Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1,false));

        final Text text = new Text(shell, SWT.BORDER);
        text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));

        DropTarget dt = new DropTarget(text, DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK);
        dt.setTransfer(new Transfer[] { FileTransfer.getInstance(), PluginTransfer.getInstance() });
        dt.addDropListener(new DropTargetAdapter() {
            public void drop(DropTargetEvent event) {
                String fileList[] = null;
                FileTransfer ft = FileTransfer.getInstance();
                if (ft.isSupportedType(event.currentDataType)) {
                    fileList = (String[]) event.data;
                }
                System.out.println(Arrays.toString(fileList));
            }
        });

        shell.setSize(300, 100);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

}
Run Code Online (Sandbox Code Playgroud)

gam*_*son 4

当来自 CDROM 设备时,似乎并非所有可能的 DND 操作都受支持。因此,您需要实现更多方法,以便DropTargetAdapter在进行时修改 Drop 操作,以缩小实际执行的操作范围,以便操作系统不会阻止 drop。

我以你的例子为例,只是做了一些小小的改变DropTargetAdapter

    @Override
    public void dropAccept( DropTargetEvent event )
    {
        Object object = FileTransfer.getInstance().nativeToJava( event.currentDataType );
        if( object instanceof String[] )
        {
            String[] strs = (String[]) object;
            System.out.println("dropAccept " + strs[0]);
            event.detail = DND.DROP_COPY;
        }
        event.detail = DND.DROP_COPY;
    }
    @Override
    public void dragEnter( DropTargetEvent event )
    {
        event.detail = DND.DROP_COPY;
    }
Run Code Online (Sandbox Code Playgroud)