2012-06-06 13 views
9

Java Custom Drag & Drop - keine Rückrufe zu TransferHandler.Java Custom Drag & Drop in JPanel

Ich möchte benutzerdefinierte Drag & Drop-Funktionalität für eine JPanel Unterklasse implementieren. Ich nach den Richtlinien der Norm DnD Tutorial:

Drag and Drop and Data Transfer

An der Oberfläche scheinen die Dinge ziemlich Entlehnung, aber wenn ich tatsächlich es versuchen, ich bekomme keinen Hinweis darauf, dass jedes DnD Verhalten geschieht. In Tatsache, keine der Methoden in meinem TransferHandler aufgerufen werden.

So lassen Sie uns überprüfen, was ich getan habe ...

ich meine eigene Container-Klasse gemacht, die sich JPanel zu verlängern erklärt:

public class DnDUnitPanel extends JPanel 
{ 
    ... 
} 

kopiert ich die ListTransferHandler aus dieser Demo:

Drop Demo

umbenannt die Klasse als DndUnitTransferHandler, getrimmt Code, der Bezug auf JList Ob ist jekte und installierte System.out.println() - Statements für jede der 5 darin enthaltenen Methoden.

ich instanziiert dann zwei verschiedene Instanzen von DnDUnitPanel wie folgt aus:

DnDUnitPanel topPanel = new DnDUnitPanel(new GridLayout(0, 4, 6, 6), true); 
// topPanel.setDragEnabled(true); 
topPanel.setName("Top Panel"); 
topPanel.setTransferHandler(new DnDUnitTransferHandler()); 

DnDUnitPanel bottomPanel = new DnDUnitPanel(new GridLayout(0, 4, 6, 6), true); 
// bottomPanel.setDragEnabled(true); 
bottomPanel.setName("Bottom Panel"); 
bottomPanel.setTransferHandler(new DnDUnitTransferHandler()); 

(und ich auch einige JLabel Instanzen erstellen und fügen Sie(), um sie an den Platten (nicht dargestellt)).

Wenn ich versuche, ein JLabel von einem Panel in ein anderes zu ziehen, passiert nichts. Also ging ich zurück und wieder gelesen diese Seite:

Transfer Handler

insbesondere was es sagt setDragEnabled():

turns on drag support. (The default is false.) This method is 
defined on each component that supports the drag gesture; the link 
takes you to the documentation for JList. 

JPanel kein setDragEnabled() Methode haben. Also, ich habe mich gefragt, was bedeutet das wirklich: "Komponente, die die Drag-Geste unterstützt"?

Ich dachte zuerst, das muss etwas bedeuten, das für die Implementierung von MouseListener und/oder MouseMotionListener deklariert ist. Ich änderte DnDUnitPanel zu deklarieren, dass es beide implementiert und alle Methoden zur Verfügung gestellt. Nachdem ich getan habe, konnte ich sehen, dass mousePressed(), mouseClicked(), mouseDragged(), usw. aufgerufen wurden, aber immer noch nichts in der TransferHandler aufgerufen wurde, und immer noch keine ziehen Cursor zeigt etwas wurde gezogen oder ist bereit, fallen gelassen zu werden.

ich selbst dann suchte JList an der Quelle und entschieden, dass „die Ziehbewegung unterstützt“ wirklich bedeutet nur, etwas, das eine ‚dragenabled‘ Eigenschaft mit dem zugehörigen Getter und Setter hat.

Also, ich habe die Eigenschaft deklariert und sofern der Getter und Setter auf DnDUnitPanel einfach durch das Kopieren Code direkt aus JList selbst (Denken vielleicht etwas, was ich nicht vollständig verstehen, ruft isDragEnabled() und der Suche nach einem wahren Wert um DnD-Verhalten zu initiieren.)

Leider hatte das Bereitstellen dieser (und das Auskommentieren der obigen Aufrufe auf DnDUnitPanel.setDragEnabled()) auch keinen Effekt.

Also ... der TransferHandler wird nie aufgerufen(). Offensichtlich fehlt etwas Wichtiges hier, aber ich sehe nicht, was das sein könnte.

Ich bin in einer Sackgasse für was als nächstes zu versuchen.

Jeder sehen, was hier fehlt?

Antwort

11

Grundsätzlich benötigen Sie eine Datenquelle.

Blick auf die anderen Stackoverflow question, here und here (eine gute Erklärung von DND)

+1

ich die Hauptsache denken, dass Neulinge in DnD-Technologie sind in der Regel nicht stolpern ist zu erkennen, dass Sie Ihre eigenen Mouselistener oder Mouse zu bieten haben um den Ziehvorgang zu starten (für benutzerdefinierte Komponenten, die nativ keine Unterstützung bieten). Ich fand das [Dreamincode-Beispiel] (http://www.dreamincode.net/forums/topic/209966-java-drag-and-drop-tutorial-part-1-basics-of-dragging/) am nützlichsten . Danke, @Xeon für deine Antwort. – user1441004

+0

der letzte Link ist 404'd –

+0

@ChrisDrappier Ich habe es gerade aktualisiert – Xeon