Java Personnalisé faites Glisser et Déposez les dans un Composite

Java Personnalisé faites Glisser et Déposez - pas de rappels à TransferHandler.

Je veux mettre en œuvre Personnalisée fonctionnalité de Glisser-Déposer pour un Composite
sous-classe. J'en suivant les directives de la norme du Mdn Tutoriel:

Le glisser-Déposer et de Transfert de Données

Sur la surface, les choses semblent assez strightforward, mais quand j'en fait
l'essayer, je ne reçois aucune indication que tout le Mdn comportement qui se passe. Dans
de fait, aucune de ces méthodes dans mon TransferHandler sont appelés.

Donc, passons en revue ce que j'ai fait...

J'ai fait mon propre Conteneur de classe qui déclare lui-même à étendre Composite:

public class DnDUnitPanel extends JPanel
{
    ...
}

J'ai copié le ListTransferHandler de cette Démo:

Baisse De Démonstration

renommé la classe comme DndUnitTransferHandler, garni de code qui est
se référant à la JList objets, et le Système installé..println() relevés
sur chacun des 5 méthodes de là.

J'ai ensuite instancier deux instances différentes de DnDUnitPanel comme ceci:

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());

(et j'ai aussi créer des JLabel instances et les ajouter() pour les panneaux
(non illustré)).

Quand j'essaie de glisser un JLabel d'un panneau à l'autre, rien ne se passe.
Je suis donc allé en arrière et de relire cette page:

Transfert De Gestionnaire

en particulier, ce qu'il dit à propos de 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.

Composite ne dispose pas d'un setDragEnabled() la méthode. Donc, j'ai demandé moi-même, ce
cette vraiment dire: "composant qui prend en charge le glisser geste"?

J'ai d'abord pensé que cela doit signifier quelque chose qui est déclarée à mettre en œuvre
MouseListener et/ou MouseMotionListener. J'ai modifié DnDUnitPanel à
déclarer qu'il met en œuvre à la fois et à condition que toutes les méthodes. Avoir
fait, j'ai pu voir que mousePressed(), mouseClicked(),
mouseDragged(), etc. ont été appelé, mais toujours rien dans la
TransferHandler a été appelé, et toujours pas de glisser le curseur indiquant
quelque chose a été déplacé ou est prêt à être supprimé.

J'ai alors regardé la source pour JList lui-même et a décidé que
"prend en charge le glisser geste" vraiment quelque chose qui a un
'dragEnabled la propriété avec les getter et setter.

Donc, j'ai déclaré la propriété et a fourni les getter et setter sur
DnDUnitPanel en copiant simplement le code directement à partir de JList lui-même (la pensée
peut-être quelque chose que je ne comprends pas tout à appelle
isDragEnabled() et à la recherche d'une véritable valeur pour lancer le Mdn comportement.)

Malheureusement, fournir ceux-ci (et de décommenter les appels ci-dessus pour
DnDUnitPanel.setDragEnabled()) n'a également eu aucun effet.

Donc... TransferHandler n'est jamais appelé(). De toute évidence, quelque chose de
important manque ici, mais je ne vois pas ce que cela pourrait être.

Je suis dans une impasse pour ce à essayer ensuite.

Ce que quelqu'un voit ce qui manque ici?

OriginalL'auteur user1441004 | 2012-06-06