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