在我的 Eclipse RCP 应用程序中,我有一个 TreeViewer,它是文件的放置目标,它在大多数情况下都能正常工作,但是当我尝试将存储在 CD ROM 上的文件从 Windows 资源管理器拖动到节点时,指示允许放置的图标不会't change and drop什么都不做。
由于人们似乎对我的问题感到困惑,这里有一个更详细的解释:
执行下面的代码(由 Baz 提供)时,我可以将文件拖放到文本框中,当我从机器上的大多数位置拖动文件时,窗口显示如下 ->
光标表示我可以放下,当我释放鼠标时,该drop(DropTargetEvent event)
方法被调用。
现在,当我做同样的事情,但从资源管理器中获取一个位于我的光驱 DVD 上的文件时,它看起来像这样:
表示不允许放置,并且当我释放鼠标时,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();
}
}