![](/img/trans.png)
[英]Why can't i drag and drop a class into a package in Eclipse?
[英]Why can't I drop files on to Eclipse / SWT Drop Target from a CD in windows
在我的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();
}
}
看來,當來自CDROM設備時,不支持所有可能的DND操作。 因此,您需要在DropTargetAdapter
上實現更多方法,以便在進行中修改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;
}
我認為更新了你的問題澄清了什么問題。
你的掉落目標使用DND_MOVE
作為旗幟。 由於我們無法刪除只讀媒體(如DVD)中的文件,
無論接收者是否決定,發送者(在這種情況下,OS的shell)都將拒絕DND通信。
您的屏幕截圖顯示移動 DND反饋而不是復制 。
dropAccept()
為您提供修改通信請求的最后機會,請謹慎使用,因為每個Transfer Type可以存在多個drop target偵聽器。 為了支持這種情況,TreeViewer的DND API與SWT的略有不同。
DND不像您認為的那樣工作。
考慮從網上下載一些文件 。 驗證下載時 , 沒有實際的文件內容,但您擁有Web資源的唯一URL 。
同樣,當您驗證放置操作時,您無法知道實際數據,因為在您接受放置操作之前沒有建立連接 。 您在驗證階段唯一可以知道的是傳輸類型 。
因此,您只能根據內容種類而不是“實際內容”來驗證丟棄
典型的驗證碼是:
public boolean validateDrop(...){
return FileTransfer.getInstance().isSupportedType(transferData);
}
接受“TransferData”后,傳輸將從連接中檢索實際數據。
所以請記住,“TransferData”與實際數據不同。
FileTransfer
檢索String
數組格式的文件,該數組包含每個文件的絕對路徑,而不是Java File
對象。
PS:剪貼板以相同的方式工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.