Eigene Objekte DND

G

Gast2

Gast
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ß
 
G

Gast2

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

Java:
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
Java:
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

Top Contributor
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! ;-)
 
G

Gast2

Gast
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...
Java:
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;
	}
	
}
 
V

Vayu

Gast
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.
 

Ähnliche Java Themen


Oben