gpt4 book ai didi

java - 为什么我不能将文件从 Windows 中的 CD 拖放到 Eclipse/SWT Drop Target

转载 作者:可可西里 更新时间:2023-11-01 13:26:40 26 4
gpt4 key购买 nike

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

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

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

Working Drag

光标指示我可以放下,当我释放鼠标时,将调用 drop(DropTargetEvent event) 方法。

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

enter image description here

表示不允许放置,当我释放鼠标时,不会调用 drop(DropTargetEvent event) 方法。

还值得注意的是,我能够将相同的 DVD 文件放入 eclipse 导航器中的文件夹中,这表明这不是机器特定的问题,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();
}

}

最佳答案

当来自 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;
}

关于java - 为什么我不能将文件从 Windows 中的 CD 拖放到 Eclipse/SWT Drop Target,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12912984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com