Drag and Drop Java
-
Das wird natürlich auch gehen, was ich auf den ersten Blick sehe, sind Transfer Objekte mit vielen Ableitungen. Da kann man sicher auch eigene erstellen oder vielleicht gibts auch eine generische Ableitung, wo man irgendwelche Zusatzdaten wie eine ID reinstecken kann.
-
Bis her kann ich nur Text übertragen.
Transfer[] transferTypes = new Transfer[] { TextTransfer.getInstance()};
Sagen wir wir haben ein class test; Wie würde der Transfertyp aussehen damit man sowas übertragen kann ?
-
Was ist TextTransfer? Das ist eine Klasse, die von Transfer abgeleitet ist (mit paar Stufen dazwischen). Warum kannst du nicht eine eigene TestTransfer Klasse davon ableiten, die sich um deine test Klasse kümmert? Oder sowas wie ByteArrayTransfer benutzen, und deine Klasse reinserialisieren? Oder von mir aus sogar als Text Serialisieren?
-
Keine Ahnung wie das geht. Es gibt noch FileTransfer.getInstance() und ImageTransfer.getInstance() .
MyTransfer implements Transfer { }
jetzt will ich meine Klasse transferieren
class myclass { }
Wie würde MyTransfer oben ausschauen ?
-
Oh blurry - 1 Minute im Internet gesucht: Drag and Drop example snippet: define my own data transfer type (also mit ByteArrayTransfer, so wie Mechanics vorgeschlagen hat).
P.S: Die dortige Klasse heißt lustigerweise auch MyTransfer
-
Muss ich diese beiden Methoden implementieren ? javaToNative und nativeToJava ?
-
Also wenn ich 120 Zeilen brauche um meinen eigenen Transfertyp zu deklarieren, dann vergehts mir wirklich. Außerdem sollte jedes beliebige Objekt transferierbar sein.
-
Diesen ganzen Code müßte man jetzt umschreiben. Und noch mit der Schwierigkeit dass nicht nur class MyType übertragen wird, sondern eigentlich alle möglichten Klassen . Könnte das hier jemand ?
public class MyType { public String fileName; public long fileLength; public long lastModified; } public class MyTypeTransfer extends ByteArrayTransfer { private static final String MYTYPENAME = "my_type_name"; private static final int MYTYPEID = registerType(MYTYPENAME); private static MyTypeTransfer _instance = new MyTypeTransfer(); private MyTypeTransfer() {} public static MyTypeTransfer getInstance () { return _instance; } public void javaToNative (Object object, TransferData transferData) { if (object == null || !(object instanceof MyType[])) return; if (isSupportedType(transferData)) { MyType[] myTypes = (MyType[]) object; try { // write data to a byte array and then ask super to convert to pMedium ByteArrayOutputStream out = new ByteArrayOutputStream(); DataOutputStream writeOut = new DataOutputStream(out); for (int i = 0, length = myTypes.length; i < length; i++){ byte[] buffer = myTypes[i].fileName.getBytes(); writeOut.writeInt(buffer.length); writeOut.write(buffer); writeOut.writeLong(myTypes[i].fileLength); writeOut.writeLong(myTypes[i].lastModified); } byte[] buffer = out.toByteArray(); writeOut.close(); super.javaToNative(buffer, transferData); } catch (IOException e) { } } } public Object nativeToJava(TransferData transferData){ if (isSupportedType(transferData)) { byte[] buffer = (byte[])super.nativeToJava(transferData); if (buffer == null) return null; MyType[] myData = new MyType[0]; try { ByteArrayInputStream in = new ByteArrayInputStream(buffer); DataInputStream readIn = new DataInputStream(in); while(readIn.available() > 20) { MyType datum = new MyType(); int size = readIn.readInt(); byte[] name = new byte[size]; readIn.read(name); datum.fileName = new String(name); datum.fileLength = readIn.readLong(); datum.lastModified = readIn.readLong(); MyType[] newMyData = new MyType[myData.length + 1]; System.arraycopy(myData, 0, newMyData, 0, myData.length); newMyData[myData.length] = datum; myData = newMyData; } readIn.close(); } catch (IOException ex) { return null; } return myData; } return null; } protected String[] getTypeNames(){ return new String[]{MYTYPENAME}; } protected int[] getTypeIds(){ return new int[] {MYTYPEID}; } }
-
blurry333 schrieb:
Könnte das hier jemand ?
ja
-
Was muss ich am Code oben ändern ?
-
Schreibt mal bitte einer den Code . Wär echt cool.
-
Schreib du mal den Code. Wäre cool von dir.
-
Wie es für ein Objekt geht, wirklich keine Ahnung. Wenn ich das richtig verstehe dann muss man jede einzelne Variable in den Byte Strom schreiben. Wenn ich aber ein Objekt habe dann gibt es keine Variablen.
-
Wenn ich das hier richtig verstehe muss man sich um jedes Byte selbst kümmern. Sagen wir die Klasse die du übertragen willst hat die Variablen x,y,z . Dann schreibst du x,y,z in der Methode javaToNative raus und in der Methode nativeToJava liest du die Bytes wieder ein. Wieso geht das nicht einfacher ? Sagen wir deine Klasse hätte auch noch eine Variable d und du vergisst Sie in den Bytestrom zu schreiben , dann geht die wahrscheinlich verloren
-
Im NodedropListener kann ich einfach
this.getSelectedObject()
was genau dem Drag Item entspricht . Somit brauch ich diesen ganzen Transfer Mist gar nicht machen. Wozu braucht man TextTransfer etc. überhaupt.
-
Für allgemeines Drag&Drop beliebiger Daten zwischen verschiedenen Applikationen zum Beispiel?
-
Das versteh ich jetzt nicht ganz. Was meinst du mit verschiedenen Applikationen ?
Warum macht da ein Transfer Sinn ? Ich mein im Objekt selbst kann man mit instanceof auch prüfen welcher Typ dahinter steckt.
-
ja geht mir genauso 120 zeichen ist viel zu viel