Transferable Zugriffsproblem

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo!

Ich habe ein Problem bei Drag and Drop, genauer gesagt mit DropTargetDropEvent.

Ich habe mir ein DropTargetListener implementiert mit der Methode public void drop(DropTargetDropEvent dtde). Dort will ich an das transferierte Object vom Typ TNode heran:

Code:
Transferable tr = dtde.getTransferable();
tnode = (TNode) tr.getTransferData(TNode.tnodeFlavor);

Soweit, so gut. TNode hat neben einigen primitiven Datenfeldern eine Referenz auf einen anderen TNode. Im Transferable ist diese Referenz gesetzt, in der tnode-Zuweisung in Zeile 2 nicht mehr! getTransferData liefert ein neues Object, in dem die Referenz auf null gesetzt wurde.

Die Angaben hab ich mit dem Debugger herausgefunden. TNode implements Transferable, Cloneable.Die clone()-Methode funktioniert auch, das Problem sollte also in getTransferData liegen.

tr ist mit DropTargetContext$TransferableProxy belegt, einer protected inner class, auf die ich keinen Zugriff habe. Auch Ableiten von DropTargetContext ist nicht möglich (kein Default Konststruktor etc.).

Hat jemand eine Idee, wie ich an das ursprüngliche Object herankomme?

Vielen Dank schon einmal!
 

byte

Top Contributor
Schreib doch Dein eigenes Transferable. Dort kannst Du dann direkt das Objekt wrappen, dass Du per DnD weiterreichen willst.
 
G

Guest

Gast
TNode implements Transferable

Das ist ja gerade die Krux. TNode clont sich korrekt selber und ist auch Transferable. Wenn ich tr.getTransferData(...) aufrufe kriege ich ein TransferableProxy. An das komme ich nicht dran, weil es ne AWT Klasse ist und ich es nicht ableiten kann (inner protected class). Dann getTransferData und weg ist die Referenz. :x
 

Marco13

Top Contributor
Irgendwie kapier ich das Problem (mal wieder) nicht: Tansferable muss NICHT von dem Implementiert werden, was transfert werden soll (auch wenn der Name das vielleicht suggeriert). Das, was man Transferen will, ist das Transferdata, und das kann man sein lassen, was man will....
 
G

Guest

Gast
Ok, die Fragestellung ist vielleicht nicht ganz trivial... ???:L

Das mit dem Transferable hab ich dann wohl missverstanden. Schua ich mir nochmal an.

Das Problem ist, dass getTransferData() eine Kopie meines TNodes anfertigt, in dem die Elternreferenz (auf ein TNode) verloren geht. Warum auch immer. Vorher kann ich mir die Referenz im Debugger angucken. Nach dem Aufruf ist sie weg.
Ich sehe momentan keinen Weg, an die Daten ohne Aufruf von getTransferData() zu kommen. Die AWT Klassen sind wasserdicht gemacht. Deshalb meine Frage an euch, ob jemand eine Möglichkeit kennt.
 

Marco13

Top Contributor
Du kannst ein "MySpecialNodeTransferable implements Transferable" erstellen, dort dann direkt deinen TNode reinlegen, und genau denselben (modulo Serialisierung usw) mit getTransferData wieder rausholen. Aber der DataTransfer ist wirklich nicht "trivial", und ich habe mich auch noch nicht sooo intensiv damit beschäftigt, d.h. vielleicht habe ich da auch noch was falsch verstanden....
 
G

Guest

Gast
Hmm, eigentlich ist das ja genau das was ich schon mache. Nur dass der MySpecialNodeTransferable bei mir ein TNode ist, der ja wieder eine Referenz auf einen TNode hat.
Aber trotzdem danke für den Ansatz, denke ich werd mal ein bißchen mit der Kapselung herumspielen...
 

Marco13

Top Contributor
Naja - dass das Transferable, das man von dem Event bekommt, NICHT wieder dieSELBE instanz ist, wie die, die man irgendwoanders reingesteckt hat, ist einleuchtend. Es wird ja nicht das Transferable transferiert (ansl in deinem Fall: NICHT der TNode) sondern das TransferData!
 
G

Gast

Gast
Stimmt, aber wie wird das Object intern kopiert? Per clone() wohl nicht, das würde die Referenz mit kopieren...

Hmm, ich hab das Problem jetzt umgangen, indem ich die notwendigen Informationen als String im TNode abspeichere. Nicht schön, aber es geht.

Trotzdem vielen Dank an alle, die sich hier an der Diskussion beteiligt haben. :)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben