ablegen In meiner Eclipse RCP-Anwendung habe ich einen TreeViewer, der ein Drop-Ziel für Dateien ist, funktioniert es in den meisten Fällen aber, wenn ich es versuche und Ziehen von Dateien, die auf einer CD-ROM gespeichert sind, vom Windows Explorer zum Knoten. Das Symbol, das anzeigt, dass Drops erlaubt sind, ändert sich nicht und das Ablegen tut nichts.Warum kann ich nicht Dateien auf Eclipse/SWT Drop Target von einer CD in Windows
Da die Menschen schien verwirrt über meine Frage ist hier eine ausführlichere Erklärung:
Wenn Sie den nachfolgenden Code ausgeführt wird (geliefert von Baz), kann ich Dateien per Drag & Drop auf das Textfeld auf, wenn ich ziehen eine Datei von den meisten Orten auf meinem Rechner, erscheint das Fenster wie folgt aus ->
der Cursor zeigt an, dass ich fallen kann, und wenn ich die Maus die drop(DropTargetEvent event)
Methode aufgerufen wird.
Nun, wenn ich das gleiche tun, aber eine Datei aus dem Explorer nehmen, die auf einer DVD in mein optisches Laufwerk ist dann sieht es wie folgt aus:
anzeigt, dass der Tropfen nicht erlaubt ist, und wenn ich die Maus loslasse, wird die drop(DropTargetEvent event)
Methode NICHT aufgerufen.
Es ist auch erwähnenswert, dass ich die gleichen DVD-Dateien in einen Ordner im Eclipse-Navigator fallen lassen kann, was darauf hinweist, dass dies kein maschinenspezifisches Problem ist, da es in den Eclipse-Bäumen etwas anderes geben muss aber ich kann es nicht sehen.
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();
}
}
Haben Sie überprüft, ob sich der 'transferType' innerhalb der' validateDrop' Methode von dem beim Ablegen von der Festplatte unterscheidet? – Baz
Sie sind TransferData-Objekte, die keine wesentlichen Unterschiede in der Struktur zu haben scheinen, aber die Operation scheint immer 16 für die ROM-Dateien zu sein, während für die Dateien, die funktionieren, die Operationen auf 2 über einen Knoten und 16 auf nicht wechseln. Das deutet darauf hin, dass der Knoten sich nicht als brauchbares Ziel für das, was gezogen wird, registriert. Es ist merkwürdig, dass ein Aufruf von validateDrop ausgeführt wird, obwohl es nicht die Absicht hat, Ihnen die Ausführung zu erlauben. – Link19
Basierend auf dem Namen '** validate ** Drop()' macht es Sinn. Wird etwas forschen. Vielleicht finde ich eine Lösung. – Baz