簡體   English   中英

為什么我不能從Windows中的CD上刪除文件到Eclipse / SWT Drop Target

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM