2009-08-07 9 views
3

J'ai une classe dérivée de JTree avec TreeCellRenderers personnalisé. J'ai implémenté le glisser-déposer dans cet arbre, donc un utilisateur peut réorganiser des nœuds d'arbre.Faites glisser et déposer des commentaires dans un JTree avec TreeCellRenderer personnalisé (Java, Swing)

Le mode de suppression est DropMode.ON_OR_INSERT, ce qui permet à l'utilisateur de supprimer des nœuds sur ou entre d'autres nœuds. Pendant que l'utilisateur fait glisser le noeud, si le pointeur pointe entre les noeuds, une ligne bleue est dessinée indiquant l'emplacement où le noeud sera inséré. Si le pointeur est sur un noeud, il n'y a aucune indication de l'endroit où le noeud sera ajouté. Cela ne se produit que lorsque j'utilise mon TreeCellRenderer personnalisé. Si j'utilise DefaultTreeCellRenderer, le nœud de dépôt est mis en surbrillance pendant le glisser.

J'ai trouvé quelques exemples sur le web, où les gens stockent le nœud actuellement mis en surbrillance dans le JTree et l'interrogent à partir du TreeCellRenderer, rendant le nœud de couleur différente si TreeCellRenderer est appelé pour le nœud supposé être a souligné.

Existe-t-il une solution plus élégante pour mettre en surbrillance le nœud de dépôt? Je n'ai pas réussi à comprendre comment DefaultTreeRenderer fait cela - il ne semble pas y avoir de hook pour glisser-déposer des fonctionnalités.

Répondre

7

I figured it out, donc juste au cas où tout le monde prend soin:

La réponse est ici: in javadoc for TreeCellRenderer

Le TreeCellRenderer est également chargé de rendre la cellule représentant chute DND de l'arbre emplacement si elle en a un. Si ce renderer se soucie de rendre l'emplacement de chute DnD, il doit interroger l'arbre directement pour voir si la ligne donnée représente l'emplacement de chute:

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 
} 

Le code ci-dessus doit être ajouté à la méthode getTreeCellRendererComponent().