SWT Drag´n´Drop vom Desktop/Explorer

Swoop

Gesperrter Benutzer
Hallo Leute,

Ich habe ein Problem. Und zwar suche ich eine Möglichkeit, Bilder, Dateien, usw. vom Desktop bzw aus dem Explorer in einen Tree zu ziehen und den Pfad zur Datei zu speichern.

Ich hab zwar schon die ein oder andere Lösung gefunden aber davon sind alle in AWT geschrieben und diese bringen mich dann nicht weiter, da ich das ganze in SWT realisieren möchte.

Habt ihr ein Beispiel parat ? Mir würde es auch reichen, wenn es auf eine Shell oder Composite funktionieren würde. Den Rest würde ich dann selbst hinbekommen.

Grüße Swoop
 
Also innerhalb einer SWT Anwendung, war das Tutorial immer hilfreich. Ich weiß nicht ob auch etwas für die sourcen außerhalb dabei ist.
DND in SWT
 
Hm das Tut hatt ich auch schon über googel gefunden. ist auch sehr Hilfreich aber halt leider fehlt noch der Teil wenn mans vom Desktop rein zieht. Wenn ich versuche die AWT vorlagen abzuwandeln zeigt er mir schon wenn ich mit einer Datei über die Shell gehe ein schwarzes rundes Verboten zeichen an. Und das dragEnter Event wird auch nicht geworfen.
 
Ja warum willst du auch das AWT benutzen, ich denke mal die benutzen einen ganz anderen Mechanismus.

Ich denk mal du brauchst einen DropTarget mit FileTransfer dann könnte es schon klappen.
Mach doch mal ein kleines KSKB mit einem Label und wie es bis jetzt aussieht.
 
Zuletzt bearbeitet von einem Moderator:
Bezgl. AWT: Ja ich wollte einfach nur versuchen es nachzubauen. Dachte mir vllt wenn ich Glück habe funktioniert es ganz ähnlich.

Was ich bis jetzt habe ist nicht viel. Ich habe momentan eine Shell mit einer Liste auf die was gezogen werden können soll. Vorerst reicht es ja nur, dass die Liste dann mal ausgibt. "Dragged" damit ich weiß dass was ankommt. Wie ich an das File komme ist ja erst der zweite Schritt aber momentan macht er halt nicht viel mehr als das schwarze Verbotszeichen anzuzeigen sobald man mit einer Datei drüber fährt oder los lässt.

Hier mein KSKB:

Java:
public class TestGUI
{
	private Shell shell;

	/**
	 * Runs the application
	 */
	public void run()
	{
		final Display display = new Display();
		shell = new Shell(display);
		shell.setSize(250, 250);
		shell.setText("Test");
		shell.setLayout(new GridLayout());

		List list = new List(this.shell, SWT.BORDER);
		list.setLayoutData(new GridData(GridData.FILL_BOTH));

		DropTarget target = new DropTarget(list, DND.DROP_COPY);
		target.addDropListener(new DropTargetAdapter()
		{

			public void dragEnter(DropTargetEvent event)
			{
				System.out.println("Enter Drag Source");
			}

			public void drop(DropTargetEvent event)
			{
				System.out.println("DropFile");
			}
		});

		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		display.dispose();
	}

	/**
	 * main-methode
	 * 
	 * @param args
	 *        {@link String}
	 */
	public static void main(String[] args)
	{
		new TestGUI().run();
	}
}
 
Ja ich habs gerade gesehen.

Mit Transfers funktionierts. Habs auch schon in mein richtiges Programm eingebaut und funktioniert einwandfrei!
Danke!
 
Java:
package a;

import java.io.File;

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.Label;
import org.eclipse.swt.widgets.Shell;

public class TestGUI {
	private Shell shell;

	/**
	 * Runs the application
	 */
	public void run() {
		final Display display = new Display();
		shell = new Shell(display);
		shell.setSize(250, 250);
		shell.setText("Test");
		shell.setLayout(new GridLayout());

		final Label label = new Label(this.shell, SWT.BORDER);
		label.setLayoutData(new GridData(GridData.FILL_BOTH));

		int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;
		DropTarget target = new DropTarget(label, operations);

		final FileTransfer fileTransfer = FileTransfer.getInstance();
		Transfer[] types = new Transfer[] { fileTransfer };
		target.setTransfer(types);

		target.addDropListener(new DropTargetAdapter() {

			public void dragEnter(DropTargetEvent event) {
				if (event.detail == DND.DROP_DEFAULT) {
					if ((event.operations & DND.DROP_COPY) != 0) {
						event.detail = DND.DROP_COPY;
					} else {
						event.detail = DND.DROP_NONE;
					}
				}
				// will accept text but prefer to have files dropped
				for (int i = 0; i < event.dataTypes.length; i++) {
					if (fileTransfer.isSupportedType(event.dataTypes[i])) {
						event.currentDataType = event.dataTypes[i];
						// files should only be copied
						if (event.detail != DND.DROP_COPY) {
							event.detail = DND.DROP_NONE;
						}
						break;
					}
				}

			}

			public void drop(DropTargetEvent event) {
				if (fileTransfer.isSupportedType(event.currentDataType)) {
					String[] files = (String[]) event.data;
					label.setText(files[0]);
				}

			}
		});

		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		display.dispose();
	}

	/**
	 * main-methode
	 * 
	 * @param args
	 *            {@link String}
	 */
	public static void main(String[] args) {
		new TestGUI().run();
	}
}

EDIT: zu spät^^
 

Zurück
Oben