Objekt zwischen 2 Java programmen copy+Paste

Status
Nicht offen für weitere Antworten.

athikka

Aktives Mitglied
Hallo

wie geht es eine bel. Transferable bzw. Serializable Klasse per copy und Paste (zwischenablage) in Ein anderes Java Programm zu transferieren (welches die Klasse natürlich verarbeiten kann)?

Bis jetzt schaffe ich es über getclipboard nur strings und Bilder zu übertragen, sobald aber mein Objekt im Spiel ist (Mit verkettete Liste darin) geht nichts mehr...


Kann mir wer helfen?
 
wandle das serialisierte Objekt in einen String um,
den ObjectOutputStream in einem ByteArrayOutputStream enden lassen, aus dem byte[] die bytes in einem StringBuilder schreiben, also in einen String,
auf der Gegenseite alles umgekehrt

vielleicht statt Serialisierung eine normale textuelle Beschreibung, z.B. XML
<HauptObjekt>
<Name>xy </Name
<Liste>
<Eintrag>
..
..
 
Zuletzt bearbeitet von einem Moderator:
hallo

danke für deinen tipp, gute idee 🙂

allerdings habe ich in meinem zu-übertragenden objekt/klasse eine liste von anderen klassen (sozusagen eine überklasse mit linkedliste in der 10 instanzen einer anderen klasse (wo z.b. imageicons gespeichert werden) gespeichert sind)

demnach muss ich auch die referenzen auflösen, weiß aber nicht wie...
soll ich all die bilder also in ein byte-array auflösen und dann in den stringbuilder hinzufügen?

problematisch wird es nämlich mit gegenseitiger referenzierung (die in der liste enthaltenen klassen enthalten zeiger untereinander und aufeinander)...


hast du da auch noch eine idee?
 
bzw wozu brauche ich serializable überhaupt? es ändert sich sogesehen nichts in der klasse von methoden, feldern usw...
 
Serializable hat nichts mit Änderung zu tun sondern mit Umwandlung in Bytes/ Text, eben zur Speicherung in Dateien oder Übertragung an andere Programme, ob nun Netzwerk oder Clipboard,
(edit: ach so, gemeint ist, das Interface fügt keine Methoden hinzu)

viele Objekt untereinander korrekt aufzulösen ist natürlich eine gewisse Kunst,
Serializable kann das aber alles,
packe alle Objekte in eine zentrale Liste oder ein Hauptobjekt, serialisiere das und alles ist gut, solange alle Serializable sind
 
Eine einfache Möglichkeit der Serialisierung (sogar ohne Serializable) ist per XStream.
 
Hallo

danke, ich sehe schon das Problem wird langsam gelöst.
Leider habe ich dies mit derliste schon probiert, also ein transferable und serializable als hauptklasse und dann eine linkedlist<unterobjekt> mit den transferable und serializable unterklassen

leider scheitert es immer beim laden aus dem Speicher (angeblich ein graphics2d Fehler -notserializableexception)

hat jemand einen beispielcode was eigene Klassen im clipboard angeht?
Ich finde nur für Images, String und file Anleitungen...
 
Graphics2d ist nunmal kein Objekt, welches kopiert werden sollte, die Exception kommt nicht ohne Grund,
das Objekt hat vielleicht Verbindungen zu internen graphischen Ressoucen,

was soll die Gegenseite damit anfangen? kopiere Bilder als BufferedImage = byte[] oder so,
kopiere Zeichenbefehle als eine Liste einfacher Objekte a la 'male Linie von x nach y'
 
Zuletzt bearbeitet von einem Moderator:
hallo,

das ist ja das lustige, ich habe kein einziges Graphics in meiner zu-übertragenden klasse!
deshalb ist es ja so unverständlich...

ich habe es mit einer simplen, leeren klasse probiert, geht auch nicht, wieder der graphics fehler...

kann es daran liegen, dass meine Jcomponent mittels setcontents die (leere) testklasse in den speicher setzt, und dass da irgendwas die graphics der JComponent verwenden will?

mit dem setzen in den speicher habe ich ja kein problem, aber das einlesen... da liefert es mir den notserializableexception...

ich habe auch all meine images in ein imageicon umgewandelt, da dies ja serializable ist...

hat jemand einen beispielcode?
 
in meinem jcomponent in der keypressed-methode

Java:
...} else if (k.getKeyCode()==KeyEvent.VK_C && k.isControlDown()){

			TransferableTree t = new TransferableTree();
			
			t.addSelection(selectedObjects);
			t.generateStructure();
			
			this.getToolkit().getSystemClipboard().setContents(t, null);


zum einlesen:

Java:
                        Clipboard clipboard = getToolkit().getSystemClipboard();
			final Transferable contents = clipboard.getContents(null);
			
			LinkedList<SerializabledNode> t = null;
			try {
			
		//HIER FEHLER (graphics2d notserializabledexception):
			TransferableTree tt = (TransferableTree) contents.getTransferData(new DataFlavor(TransferableTree.class, "TransferableTree"));

			t=tt.readylist;

			System.out.println("KORREKT EINGELESEN");
			} catch (UnsupportedFlavorException e2) {
				e2.printStackTrace();
			} catch (IOException e2) {
				e2.printStackTrace();
			}



klasse transferabletree(die zu übertragende)


Java:
import java.awt.Color;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;




	public class TransferableTree implements Transferable, Serializable, ClipboardOwner{
		
		LinkedList<SerializabledNode> readylist;
		private boolean ready = false;
		
		
		public TransferableTree(){
			readylist = new LinkedList<SerializabledNode>();
		}
		
		
		
		public void addSelection(Paintable selectedObjects[]){
			ready = false;	
		}
		

		
		public void generateStructure(){
			ready = true;
		}
		
		@Override
		public Object getTransferData(DataFlavor d) throws UnsupportedFlavorException, IOException {
			return this;
			
		}

		@Override
		public DataFlavor[] getTransferDataFlavors() {
	        DataFlavor[] dfA = new DataFlavor[1];
	        dfA[0] = dataFlavor;
	        return dfA;

		}

		@Override
		public boolean isDataFlavorSupported(DataFlavor d) {
	        return false; //noch nicht wichtig, da es sowieso gar nicht geht...
		}



		@Override
		public void lostOwnership(Clipboard arg0, Transferable arg1) {
			// TODO Auto-generated method stub
			
		}


		
		
	}


und meine unterklasse:

Java:
import java.awt.Color;
import java.io.Serializable;
import java.sql.Date;



	public class SerializabledNode implements Serializable{
//		public ArrayList<Table.HoverObjSerializable> hoverobj = new ArrayList<Table.HoverObjSerializable>(); //OK
//		public ArrayList<SerializabledNode> children = new ArrayList<SerializabledNode>(); //ERST SPƒTER DANN
//		protected SymbolSerializable singleSymbol; //WENN CHILDREN ERST SPƒTER DANN
//		protected SerializabledNode parent; //ERST SPƒTER
		
		public Color border;
		public Color cfill;
		public boolean fill;
		public String text;
		public boolean bold = false;
		public int fontsize = 15;
		public int priority = 0; 
		public String todoname = null;
		public Date tododatetime = null;
		public boolean todobit = false;
		public int todoprogress = -1;
		
		public SerializabledNode(Table controller, Paintable source){
//für testzwecke leer gelassen
		}
	}


ich habe jetzt nicht mehr herumprobiert, aber ich nehme mal an, dass es nicht erlaubt ist in meiner transferableTree klasse eine referenz auf mein Table zu haben (auf die jcomponent) oder (da in meiner Jcomponent ein Feld
Java:
Graphics G;
vorkommt?
 
Zuletzt bearbeitet:
Java:
 public DataFlavor[] getTransferDataFlavors() {
            DataFlavor[] dfA = new DataFlavor[1];
            dfA[0] = dataFlavor;
            return dfA;
 }
was ist hier 'dataFlavor' für eine Variable?

ich bekomme das jedenfalls nicht hin,
wenn ich ein Programm
Java:
    public static void main(String[] args)
        throws Exception
    {
        System.out.println("start");

        TransferableTree t = new TransferableTree();
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(t, null);
        System.out.println("schreibe  : " + t);


        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        final Transferable contents = clipboard.getContents(null);
        DataFlavor df = new DataFlavor(TransferableTree.class, "TransferableTree");
        Object o = contents.getTransferData(df);
        System.out.println("EINGELESEN: " + o);

        Thread.sleep(5000);
        o = contents.getTransferData(df);
        System.out.println("EINGELESEN: " + o);


        System.out.println("ende");
    }
laufen lasse und ein anderes in der Zwischenzeit auch ein Objekt ins Clipboard schreibt,
dann interessiert das das erste Programm nach 5 sec nicht, liest genau dasselbe nochmal,

ohne lauffähiges Komplettprogramm(e) kann ich leider nicht mithelfen
 
hallo es ist
Java:
DataFlavor dataFlavor;
(ist aber zu vernachlässigen)

wirft es bei dir aber keine exception?
muss ich mir anschauen...

Transferabletree habe ich hier ja leer gelassen, da es auch so bei mir nicht gegangen ist.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben