# Eigene Objekte DND



## Gast2 (15. Dez 2009)

Hallo zusammen,

ich hab hier DND in SWT mal ein bischen angeschaut wie man DND in SWT realisiert. Meine Frage ist wie ich das auf eigene Objekte machen kann ich würde gern etwas in eine View reinziehen können. Das hab ich schon hinbekommen mit einfachen TextSachen...
Jetzt würde ich gerne eigene Objekte hineinziehen können. Kennt jemand eine gute Seite? Oder kurze erklräung gibt es schon fertige Klassen dazu oder muss ich ein eigenes TransferData machen?

Danke gruß


----------



## Gast2 (16. Dez 2009)

Also soweit bin ich schon gekommen^^...
mir fehlt nur noch das javaToNative kein plan was ich da drin machen muss...


```
public class KundenTransfer extends ByteArrayTransfer{


    private static final String KUNDEN_TRANSFER_NAME = "KundenTransfer";

    private static final int KUNDEN_TRANSFER_ID = registerType(KUNDEN_TRANSFER_NAME);

    private static KundenTransfer instance = new KundenTransfer();	
	
    public static KundenTransfer getInstance() {
        return instance;
      }
    
	@Override
	protected int[] getTypeIds() {
		return new int[]{KUNDEN_TRANSFER_ID};
	}

	@Override
	protected String[] getTypeNames() {
		return new String []{KUNDEN_TRANSFER_NAME};
	}
	
	@Override
	public void javaToNative(Object object, TransferData transferData) {
		if (!validate(object) || !isSupportedType(transferData)) {
			DND.error(DND.ERROR_INVALID_DATA);
		}
		Kunde kunde = (Kunde) object;
	}
	
	@Override
	public Object nativeToJava(TransferData transferData) {
		if (!isSupportedType(transferData) || transferData.pIDataObject == 0) return null;
		return super.nativeToJava(transferData);
	}
	
	@Override
	protected boolean validate(Object object) {
		if(object == null || !(object instanceof Kunde)) return false;
		return super.validate(object);
	}
}
```


wenn ich den super aufruf mache fliegt immer eine exception

```
org.eclipse.swt.SWTException: Data does not have correct format for type
	at org.eclipse.swt.dnd.DND.error(DND.java:277)
	at org.eclipse.swt.dnd.DND.error(DND.java:228)
	at org.eclipse.swt.dnd.ByteArrayTransfer.javaToNative(ByteArrayTransfer.java:163)
	at dn.KundenTransfer.javaToNative(KundenTransfer.java:37)
	at org.eclipse.swt.dnd.DragSource.GetData(DragSource.java:472)
	at org.eclipse.swt.dnd.DragSource.access$7(DragSource.java:436)
	at org.eclipse.swt.dnd.DragSource$4.method3(DragSource.java:259)
	at org.eclipse.swt.internal.ole.win32.COMObject.callback3(COMObject.java:92)
	at org.eclipse.swt.internal.ole.win32.COM.VtblCall(Native Method)
	at org.eclipse.swt.internal.ole.win32.IDataObject.GetData(IDataObject.java:25)
	at org.eclipse.swt.dnd.Transfer.getData(Transfer.java:52)
	at org.eclipse.swt.dnd.ByteArrayTransfer.nativeToJava(ByteArrayTransfer.java:196)
	at dn.KundenTransfer.nativeToJava(KundenTransfer.java:46)
	at org.eclipse.swt.dnd.DropTarget.Drop(DropTarget.java:443)
	at org.eclipse.swt.dnd.DropTarget$3.method6(DropTarget.java:258)
	at org.eclipse.swt.internal.ole.win32.COMObject.callback6(COMObject.java:119)
	at org.eclipse.swt.internal.ole.win32.COM.DoDragDrop(Native Method)
	at org.eclipse.swt.dnd.DragSource.drag(DragSource.java:363)
	at org.eclipse.swt.dnd.DragSource.access$0(DragSource.java:289)
	at org.eclipse.swt.dnd.DragSource$1.handleEvent(DragSource.java:172)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at test.Application.start(Application.java:20)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1311)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1287)
```


----------



## dzim (16. Dez 2009)

Ich hab das auch schon mal probiert und bin wie du an diesem nativeToJava und javaToNative stecken geblieben...
Also falls das wer kennt: Bitte bitte bitte mal vielleicht an einem kleinem Beipiel erläutern! Das wäre nett! ;-)


----------



## Gast2 (16. Dez 2009)

Also ich habs jetzt mal so gemacht....Wie der Name eigentlich schon sagt werde die Daten als Byte Array übertragen. Jetzt kann man beliebig serailisierte Objekte hin und her schieben...
Ist auch nur eine Testklasse  kann man bestimtm für beliebige Typen noch generisch machen...

```
public class KundenTransfer extends ByteArrayTransfer{


    private static final String KUNDEN_TRANSFER_NAME = "KundenTransfer";

    private static final int KUNDEN_TRANSFER_ID = registerType(KUNDEN_TRANSFER_NAME);

    private static KundenTransfer instance = new KundenTransfer();	
	
    
    public static KundenTransfer getInstance() {
        return instance;
      }
    
	@Override
	protected int[] getTypeIds() {
		return new int[]{KUNDEN_TRANSFER_ID};
	}

	@Override
	protected String[] getTypeNames() {
		return new String []{KUNDEN_TRANSFER_NAME};
	}
	
	@Override
	public void javaToNative(Object object, TransferData transferData) {
		if (!validate(object) || !isSupportedType(transferData)) {
			DND.error(DND.ERROR_INVALID_DATA);
		}
		try {
			super.javaToNative(KundenTransfer.getBytes(object), transferData);
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		
	
	}
	
	@Override
	public Object nativeToJava(TransferData transferData) {
		if (!isSupportedType(transferData)) return null;
		byte[] bs = (byte[]) super.nativeToJava(transferData);
		Object o = null;
		try {
			o = KundenTransfer.getObject(bs);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {

			e.printStackTrace();
		}
		return o;
	}
	
	@Override
	protected boolean validate(Object object) {
		if(object == null || !(object instanceof Kunde)) return false;
		return super.validate(object);
	}
	
	public static byte[] getBytes(Object obj) throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(bos);
		oos.writeObject(obj);
		oos.close();
		bos.close();
		return bos.toByteArray();
	}
	
	public static Object getObject(byte[] bs) throws IOException, ClassNotFoundException {
		Object obj;
		ByteArrayInputStream bis = new ByteArrayInputStream(bs);
		ObjectInputStream ois = new ObjectInputStream(bis);
		obj = ois.readObject();
		ois.close();
		bis.close();
		return obj;
	}
	
}
```


----------



## Vayu (6. Jan 2010)

sehr cool SirWayne ... hatte das auch schonmal probiert und bin da auch hängen geblieben und war dann im Endeffekt froh, dass ich eine fertige Klasse im Netz gefunden habe, die genau das gemacht hat was ich brauchte.
Aber für die Zukunft gut zu wissen.


----------

