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)
当来自 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)
| 归档时间: |
|
| 查看次数: |
2642 次 |
| 最近记录: |