6

私のEclipseRCPアプリケーションには、ファイルのドロップターゲットであるTreeViewerがありますが、ほとんどの状況で正常に機能しますが、CD ROMに保存されているファイルをWindowsエクスプローラーからノードにドラッグしようとすると、ドロップが許可されていることを示すアイコンが表示されません。変更せず、ドロップしても何も起こりません。

人々は私の質問について混乱しているようだったので、ここにもっと詳細な説明があります:

以下のコード(Bazが提供)を実行すると、ファイルをドラッグしてテキストボックスにドロップできます。マシンのほとんどの場所からファイルをドラッグすると、ウィンドウは次のように表示されます->

ワーキングドラッグ

カーソルはドロップできることを示しており、マウスを離すとdrop(DropTargetEvent event)メソッドが呼び出されます。

同じことをしますが、オプティカルドライブのDVDにあるエクスプローラーからファイルを取得すると、次のようになります。

ここに画像の説明を入力してください

ドロップが許可されていないことを示し、マウスを離してもdrop(DropTargetEvent event)メソッドは呼び出されません。

同じDVDファイルを日食ナビゲーターのフォルダーにドロップできることも注目に値します。これはマシン固有の問題ではないことを示しています。日食ツリーにはそれを可能にする何か別のものがあるはずですが、私はできます。見てください。

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();
    }

}
4

3 に答える 3

4

CDROMデバイスからの場合、可能なすべてのDND操作がサポートされているわけではないようです。DropTargetAdapterしたがって、OSがドロップを防止しないように、実際に実行される操作を絞り込むために、進行中にドロップ操作を変更するために、にさらにいくつかのメソッドを実装する必要があります。

私はあなたの例を取り、ちょうど小さな変更を加えました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;
    }
于 2012-10-29T13:19:39.510 に答える
1

あなたの質問を更新すると、問題が何であるかが明らかになると思います。

ドロップターゲットDND_MOVEをフラグとして使用します。DVDなどの読み取り専用メディアのファイルは削除できないため、

送信者(この場合、OSのシェル)は、受信者の決定に関係なく、DND通信を拒否します。

あなたのスクリーンショットは、コピーではなく移動DNDフィードバックを示しています。

dropAccept()通信要求を変更する最後の機会を提供します。転送タイプごとに複数のドロップターゲットリスナーが存在する可能性があるため、これは慎重に使用してください。このケースをサポートするために、TreeViewerのDNDAPIはSWTのものとは少し異なります。

于 2012-10-30T11:36:06.933 に答える
0

DNDは、思ったとおりに機能しません。

Webからファイルをダウンロードすることを検討してください。ダウンロードを検証するとき、実際のファイルコンテンツはありませんが、Webリソースの唯一のURLがあります。

同様に、ドロップ操作を検証する場合、ドロップ操作を受け入れるまで接続が確立されていないため、実際のデータを知ることはできません。検証フェーズで知ることができるのは、転送タイプの種類だけです。

したがって、「実際のコンテンツ」ではなく、コンテンツの種類に基づいてのみドロップを検証できます。

一般的な検証コードは次のとおりです。

public boolean validateDrop(...){
    return FileTransfer.getInstance().isSupportedType(transferData);
}

「TransferData」を受け入れると、転送は接続から実際のデータを取得します。

したがって、「TransferData」は実際のデータとは異なることに注意してください。

は、Javaオブジェクトではなく、各ファイルへの絶対パスを含む配列FileTransferの形式でファイルを取得します。StringFile

PS:クリップボードは同じように機能します。

于 2012-10-29T02:35:59.273 に答える