Drag n' Drop - Probleme mit Transferable

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

ich habe Probleme mit dem interface Transferable.

Ich habe eine Methode, die so aussieht (es geht um das hier):
Code:
			public ConnectorState isAcceptable(Widget widget, Point point, Transferable transferable) {
				Image dragImage = getImageFromTransferable(transferable);
                                ...
				return ConnectorState.ACCEPT;
			}
Die getImageFromTransferable Methode:
Code:
			private Image getImageFromTransferable(Transferable transferable) {
				Object o = null;
				try {
					o = transferable.getTransferData(DataFlavor.imageFlavor);
				} catch (IOException ex) {
					ex.printStackTrace();
				} catch (UnsupportedFlavorException ex) {
					ex.printStackTrace();
				}
				return o instanceof Image ? (Image) o : Utilities.loadImage("/images/toolbarmap.png");
			}

Das Problem ist folgendes:
Es fliegt eine UnsupportedFlavorException bei o = transferable.getTransferData(DataFlavor.imageFlavor);
Der Grund dafür ist mir auch klar: Ich ziehe die Daten aus einer JList, die aus einem Icon und einem Text besteht.

Daher hab ich versucht eine eigene Transferable Klasse und einen eigenen DataFlavor zu basteln:
Code:
public class MyTrans implements Transferable{
    private ImgTxt transferredObject;
    private static DataFlavor someClassFlavor = new DataFlavor(ImgTxt.class, ImgTxt.class.getSimpleName());

    public MyTrans(ImgTxt transferredObject)
    {
        this.transferredObject = transferredObject;
    }

    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException
    {
        if (!flavor.equals(someClassFlavor))
        {
            throw new UnsupportedFlavorException(flavor);
        }
        return transferredObject;
    }

    public DataFlavor[] getTransferDataFlavors()
    {
        return new DataFlavor[]{ someClassFlavor };
    }

    public boolean isDataFlavorSupported(DataFlavor flavor)
    {
        return flavor.equals(someClassFlavor);
    } 
}

Das Problem ist nun, dass ich meine Klasse MyTrans nicht in obiger Methode angeben kann:
Code:
public ConnectorState isAcceptable(Widget widget, Point point, MyTrans transferable) {
Denn dann bekomme ich den Compilerfehler:
The type new AcceptProvider(){} must implement the inherited abstract method
AcceptProvider.isAcceptable(Widget, Point, Transferable)
Diese Fehlermeldung verstehe ich nicht. Meine Klasse MyTrans implementiert doch das Interface Transferable, warum kann ich die dann nicht anstelle von Transferable angeben?
 

Marco13

Top Contributor
Naja - ich kenne die Klasse AcceptProvider (und ihren Zweck) nicht genau, aber im einfachsten Fall implementierst du sie für ein allgemeines Transferable, und castest das dann auf MyTrans
Code:
public ConnectorState isAcceptable(Widget widget, Point point, Transferable transferable) 
{
    if (!(transferable instanceof MyTrans))
    {
        return ConnectorState.REJECT;
    }
    MyTrans myTrans = (MyTrans)transferable;
    ....
}
Ob das notwendig oder gut ist, weiß ich nicht - dazu kenne ich den Kontext nicht genau genug...
 
G

Gast

Gast
Hi Marco,

danke für deine Antwort. Das mit dem Casten klappt nicht -> ClassCastException.

Grund hierfür ist, dass ich ja auch der JList, aus der die Daten kommen, irgendwie verklickern muss, dass sie nicht das "normale" Transferable interface nehmen soll, sondern meine MyTrans implementierung. Nur wie?
 
G

Guest

Gast
Hab hier mal eine lauffähige Demo erstellt:

Download

Wäre super wenn sich jemand das mal anschauen könnte!
 
G

Gast

Gast
Prima wenn das Programm funktioniert:

Die Frage ist immer noch die gleiche:

Meine JList verwendet intern die Klasse ImgTxt um sowohl ein Icon als auch einen Text darzustellen. Ziehe ich per Drag n' Drop jetzt aus der JList ein Element auf die Scene, dann fliegt eine UnsupportedFlavorException.
Grund ist, weil der "normale" TransferHandler nur Text, String und Image kennt, aber nicht den Typ ImgTxt. Daher versuche ich einen eigenen Transferhandler MyTrans einzusetzen. Und genau daran scheitere ich.
Das interface AcceptProvider verlangt strikt in seinen Methoden:
Code:
public ConnectorState isAcceptable(Widget widget, Point point, Transferable transferable) {
Ich müsste sie aber ändern zu:
Code:
public ConnectorState isAcceptable(Widget widget, Point point, MyTrans transferable) {
Das schaffe ich nicht. Hast du ne Idee?
 

Marco13

Top Contributor
Also ich kapier's nicht. Wenn man da was aus der Liste in die Szene zieht, steht da "Accept called", aber ein Exception fliegt nicht. Vielleicht kann's ja jemand anderes nachvollziehen..........
 
G

Guest

Gast
Ja klar funktioniert das weil ich eine lauffähige Demo bauen wollte.
Ändere doch mal:
Code:
			private Image getImageFromTransferable(Transferable transferable) {
				Object o = null;
				try {
					// this is where the the exception is thrown
					o = transferable.getTransferData(DataFlavor.stringFlavor);
auf:
Code:
			private Image getImageFromTransferable(Transferable transferable) {
				Object o = null;
				try {
					// this is where the the exception is thrown
					o = transferable.getTransferData(DataFlavor.imageFlavor);
dann fliegt eine Exception, weil in transferable eben kein Image steckt, sondern ein ImgTxt.
Ersteres funktioniert auch nur, weil es von jedem Objekt eine String Repräsentation gibt, also hier: ImgTxt@cf2c80
Danach greift :
Code:
return o instanceof Image ? (Image) o : Utilities.loadImage("image1.png");
und liefert ein default-Bild zurück.

Klar geworden? Falls nicht erklär ich es noch ausführlicher.
 

Marco13

Top Contributor
Ja ... das alles jetzt nachvollziehen - hm. Mir ist nur nicht klar, was du erwartest, wenn du
Code:
protected Transferable createTransferable(JComponent c) {
        return new StringSelection(exportString(c));
    }
schreibst. Wenn du da eigene Objekte draggen und Transferen willst, musst du wohl deine eigene Transferable-Implementierung schreiben.
 
G

Gast

Gast
Ahhh ja,

jetzt stellt sich die Frage ob ich außer einem eigenen Transferhandler, einem eigenen Dataflavor und eben der genannten Methode sonst noch was anpassen muss. Mal probieren....

Momentan mach ich es, man möge es mir verzeihen, mit Hilfe der Serialisierung. Also Objekt serialisieren, als String durch den Transferhandler jagen, und hinten wieder zusammenbauen.
 

Marco13

Top Contributor
Was heißt "verzeihen"? AFAIK wird für den DataTransfer IMMER Serialisierung verwendet ???:L kann mich aber auch irren.

Bei einer Änderung von "StringSelection" nach "ImgTxtTransferable" sollte sonst nicht sooo viel zu ändern sein. Das TransferData IST dann eben das ImgTxt, d.h. das kann man sich da dann einfach rausholen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Drag & Drop Hilfe Java Basics - Anfänger-Themen 5
DStrohma Grundsätzliche Fragen zu Drag & Drop Java Basics - Anfänger-Themen 1
M Drag & Drop - Interaktion zwischen Java und dem OS Java Basics - Anfänger-Themen 1
B Drag & Drop für Panels Java Basics - Anfänger-Themen 6
B List - Drag&Drop Java Basics - Anfänger-Themen 8
P Input/Output String via Drag & Drop auf jar-Archiv Java Basics - Anfänger-Themen 2
K Eclipse wie Swing per Drag und Drop erstellen Java Basics - Anfänger-Themen 2
U Drag&Drop von Tabelle in Textfeld Java Basics - Anfänger-Themen 3
S Drag and Drop von .txt Dateien in eine Liste Java Basics - Anfänger-Themen 2
M Drag and Drop eines Graphikelements Java Basics - Anfänger-Themen 19
R Drag&Drop mit Parametern Java Basics - Anfänger-Themen 6
B Drag and Drop fähige Trackliste..nurnoch ein kleines Problem Java Basics - Anfänger-Themen 16
O Drag & Drop mit Image? Java Basics - Anfänger-Themen 2
T ganzes Object Drag und Drop Java Basics - Anfänger-Themen 19
G Drag and Drop Java Basics - Anfänger-Themen 6
G Drag and drop Verständnissproblem. Java Basics - Anfänger-Themen 8
N drag and drop mit JList Java Basics - Anfänger-Themen 5
B Drag&Drop mit Swing Java Basics - Anfänger-Themen 17
B Swing: Zeichnen mit Drag and Drop Java Basics - Anfänger-Themen 11
R Drag'n'Drop Box Java Basics - Anfänger-Themen 2
E Cursor Image bei Drag'n'Drop ändern Java Basics - Anfänger-Themen 6
X Gwt DnD, Drag auf Droparea in anderer Klasse? Java Basics - Anfänger-Themen 0
K Drop-down Menü (swing) Java Basics - Anfänger-Themen 4
S Java und HTML- Drop Down- Mehrfachauswahl Java Basics - Anfänger-Themen 3
D Zwei Drop downs für voneinander abhängige Bundesländer- und Städteauswahl Java Basics - Anfänger-Themen 9
K SWT Drop Box Java Basics - Anfänger-Themen 11
E Adobe Designer Drop Down Feld & If Abfrage Java Basics - Anfänger-Themen 4
M statt drop down menü - buttons Java Basics - Anfänger-Themen 5
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
P Probleme mit NetBeans: Wie lässt sich jar. Datei an einem MacBook öffnen Java Basics - Anfänger-Themen 21
I Projekte in IDE untereinander sharen / Probleme beim Build Java Basics - Anfänger-Themen 8
MiMa Probleme mit Datentyp long ?? Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
B Quiz mit RMI Probleme mit RMI start Java Basics - Anfänger-Themen 4
httprt Probleme bei dem erstellen von leveln in meinem Spiel Java Basics - Anfänger-Themen 2
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
V Probleme Guessing Game Java Basics - Anfänger-Themen 8
hebein PDF Ausdruck auf Drucker - Probleme mit Format Java Basics - Anfänger-Themen 17
R JMenu/JMenuItem Probleme Java Basics - Anfänger-Themen 2
B Static vs non static und Probleme daraus Java Basics - Anfänger-Themen 13
J Probleme mit dem Debugger Java Basics - Anfänger-Themen 4
I Probleme mit OutputStream - Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 4
J Probleme mit Kompilierung Java Basics - Anfänger-Themen 11
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
C Probleme mit paintComponent Java Basics - Anfänger-Themen 13
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
E JavaFX Editor Probleme mit der Zwischenablage Java Basics - Anfänger-Themen 12
C Probleme mit dem Erstellen und Importieren von Packages Java Basics - Anfänger-Themen 6
3 OOP erste Versuche, OOP zu verstehen. Probleme mit gettern und settern Java Basics - Anfänger-Themen 4
R Erste Schritte Probleme bei 2D Spielfeld, mit einzufügender "Person" Java Basics - Anfänger-Themen 5
P Probleme bei der Installation von JavaFX Java Basics - Anfänger-Themen 3
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
Dimax String Probleme Java Basics - Anfänger-Themen 12
N Probleme beim printen von Arrays durch for Schleife Java Basics - Anfänger-Themen 3
Splayfer Java Array Probleme Java Basics - Anfänger-Themen 3
J Probleme bei IllegalArgumentException "werfen". Java Basics - Anfänger-Themen 1
K Probleme bei der Ausgabe - komme nicht weiter :/ Java Basics - Anfänger-Themen 15
X Probleme im Umgang mit PriorityQueue Java Basics - Anfänger-Themen 75
D Probleme mit dem Windowbuilder und JComboBox Java Basics - Anfänger-Themen 2
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
X Probleme mit Übungsaufgaben zu Zahlentypen Java Basics - Anfänger-Themen 4
G Probleme bei Aufgabe Java Basics - Anfänger-Themen 12
P Erste Schritte Probleme mit dem Programmieren Java Basics - Anfänger-Themen 12
B Probleme bei einer Aufgabe Java Basics - Anfänger-Themen 19
Franzi1001 Probleme mit Eclipse Java Basics - Anfänger-Themen 7
T Probleme bei Installation von JDK Java Basics - Anfänger-Themen 2
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
C Probleme bei Regex Java Basics - Anfänger-Themen 9
V Probleme mit Arrays Java Basics - Anfänger-Themen 8
D Kleine Probleme mit Split-Befehlen Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
G Probleme bei Frame aufgaben Java Basics - Anfänger-Themen 6
N Probleme mit dem ActionListener Java Basics - Anfänger-Themen 4
D Probleme beim Kompelieren mache ich etwas falsch ? Java Basics - Anfänger-Themen 3
L Probleme mit Java Java Basics - Anfänger-Themen 3
S Probleme mit abspielen einer .wav Datei Java Basics - Anfänger-Themen 2
J Probleme bei der Umwandlung einer Farbe von Hex zu RGB Java Basics - Anfänger-Themen 8
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
M Probleme beim aktualisieren eines JPanels Java Basics - Anfänger-Themen 7
J Probleme beim Array ausgeben Java Basics - Anfänger-Themen 4
M Probleme bei rekursiver Zuordnung Java Basics - Anfänger-Themen 1
I Probleme mit 2 dimensionale Arrays Java Basics - Anfänger-Themen 3
H Best Practice View probleme Java Basics - Anfänger-Themen 2
B Probleme mit Kreisberechnung Java Basics - Anfänger-Themen 15
E Probleme mit Scanner Java Basics - Anfänger-Themen 4
J Eclipse Export Probleme Java Basics - Anfänger-Themen 25
M Probleme beim verwenden von Packages Java Basics - Anfänger-Themen 6
D Probleme mit der Übergabe einer BorderPane Java Basics - Anfänger-Themen 2
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
BlueFox Tabelle in der Konsole ausgeben - Probleme Java Basics - Anfänger-Themen 1
G Methoden Probleme beim Methodenaufruf Java Basics - Anfänger-Themen 2
V Klassen ObjectInputStream ->ReadObject Probleme Java Basics - Anfänger-Themen 5
P Probleme mit der Do-Schleife Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben