2010-06-17 18 views
5

Question concerne Java 5 et Drag n Drop.Comment trouver le composant de source de glissement dans la cible de transfert de TransferHandler?

Existe-t-il un moyen de déterminer la source de glissement composant dans la cible TransferHandler?

J'ai besoin de savoir ceci dans ma méthode canImport(..) ou importData(..) afin de prendre différentes actions pour transférer des données du même type ou DataFlavor.

La façon dont je l'ai atteint c'est actuellement à pirater le DataFlavor « Human Readable champ » et définir une action de chaîne, ce qui quelque chose comme ceci:

DataFlavor localCopyFooFlavor = new DataFlavor(Foo.class, "COPY"); 
DataFlavor localEditFooFlavor = new DataFlavor(Foo.class, "EDIT"); 

utiliser ce champ pour décider des mesures à prendre. Je suis sûr que c'est faux.

Merci.

Répondre

3

Compris.

La clé consiste à créer un composant cible DataFlavor per drop. Donc ici j'ai 4 cibles qui acceptent des gouttes de type foo, 3 boutons et 1 panel.

fooCopyButtonFlavor = new DataFlavor(FooCopyButtonTransferData.class, "Foo 'Copy Button' Transfer Data"); 
fooEditButtonFlavor = new DataFlavor(FooEditButtonTransferData.class, "Foo Entry 'Edit Button' Transfer Data"); 
fooDeleteButtonFlavor = new DataFlavor(FooDeleteButtonTransferData.class, "Foo Entry 'Delete Button' Transfer Data"); 
fooDialogPanelFlavor = new DataFlavor(FooDialogPanelTransferData.class, "Foo Entry 'Dialog Panel' Transfer Data") 

j'ai décidé de conclure ma classe Foo de l'État.

Et de faire ce wrapper implémente une interface personnalisée que j'ai nommé TransferDataStrategy. Faire ceci maintenant me permet d'effectuer différentes actions dans la fonction importData (...) pour les mêmes saveurs.

public interface TransferDataStrategy<MODEL> 
{ 
    MODEL getModel(); 

    OptionStrategy getOptionStrategy(); 
} 

Mes Transferable mises en œuvre (ce qui peut être considéré comme étant la source de la traînée) peut maintenant conduire ce qui se passe sur une chute pour la même DataFlavor (ou déplacer du composant cible) en retournant différentes stratégies.

public class SourceOneTransferOperation implements Transferable 
{ 
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException 
    { 
     if (flavor.equals(FooDataFlavor.fooCopyButtonFlavor)) { 
      TransferDataStrategy<Foo> tds = new FooCopyAAA(model); 
      return tds; 
     } 
    ... 
    } 
} 

La Source de notification deux ci-dessous prend également en charge FooCopyButtonFlavor, mais renvoie une stratégie différente.

public class SourceTwoTransferOperation implements Transferable 
{ 
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException 
    { 
     if (flavor.equals(FooDataFlavor.fooCopyButtonFlavor)) { 
      TransferDataStrategy<Foo> tds = new FooCopyBBB(model); 
      return tds; 
     } 
    ... 
    } 
} 

Ceci est assez difficile à expliquer mais j'espère que cela pourrait aider.