2009-08-07 9 views
3

Ich habe eine Klasse von JTree mit benutzerdefinierten TreeCellRenderers abgeleitet. Ich habe Drag and Drop in dieser Baumstruktur implementiert, sodass ein Benutzer Baumknoten neu anordnen kann.Drag & Drop-Feedback in einem JTree mit benutzerdefinierten TreeCellRenderer (Java, Swing)

Der Drop-Modus ist DropMode.ON_OR_INSERT, sodass der Benutzer Knoten auf oder zwischen anderen Knoten löschen kann. Während der Benutzer den Knoten zieht, wird, wenn der Zeiger zwischen Knoten zeigt, eine blaue Linie gezeichnet, die einen Ort angibt, an dem der Knoten eingefügt wird. Wenn sich der Zeiger auf einem Knoten befindet, gibt es keinen Hinweis darauf, wo der Knoten hinzugefügt wird. Dies geschieht nur, wenn ich meinen benutzerdefinierten TreeCellRenderer verwende. Wenn ich einen DefaultTreeCellRenderer verwende, wird der Drop-Node beim Ziehen hervorgehoben.

Ich habe ein paar Beispiele im Web gefunden, wo Leute den Knoten speichern, der gerade im JTree markiert ist und ihn vom TreeCellRenderer abruft, der den Knoten in anderer Farbe rendert, wenn TreeCellRenderer für den Knoten aufgerufen wird, der sein soll markiert.

Gibt es eine elegantere Lösung, um den Drop-Knoten hervorzuheben? Ich habe es noch nicht geschafft, herauszufinden, wie der DefaultTreeRenderer das macht - es scheint keine Haken darin zu geben, die Funktionalität zu ziehen und fallen zu lassen.

Antwort

7

ich es herausgefunden, so nur für den Fall jemand kümmert:

Die Antwort ist hier: in javadoc for TreeCellRenderer

Die TreeCellRenderer auch verantwortlich ist, die die Zelle für die Darstellung des Baumes aktuellen DnD Ablageort wenn es darstellt hat eins. Wenn dieser Renderer kümmert sich um die DnD Ablageort machen, sollte es den Baum direkt zu sehen abfragen, wenn die gegebene Zeile der Ablegestelle darstellt:

JTree.DropLocation dropLocation = tree.getDropLocation(); 
if (dropLocation != null 
     && dropLocation.getChildIndex() == -1 
     && tree.getRowForPath(dropLocation.getPath()) == row) { 

    // this row represents the current drop location 
    // so render it specially, perhaps with a different color 
} 

Der obige Code sollte getTreeCellRendererComponent() -Methode hinzugefügt werden.