2010-06-17 14 views
5

La domanda riguarda Java 5 e Drag n Drop.Come trovare il componente sorgente di trascinamento nella destinazione di rilascio TransferHandler?

C'è un modo per determinare la componente di trascinamento componente nella destinazione di rilascio TransferHandler?

ho bisogno di sapere questo nel mio metodo canImport(..) o importData(..) al fine di intraprendere azioni diverse per trasferire i dati dello stesso tipo o DataFlavor.

Il modo in cui ho raggiunto questo momento è quello di dirottare il DataFlavor 'leggibile Field' e impostare un'azione di stringa, con conseguente qualcosa di simile:

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

quindi utilizzare questo campo per decidere quale azione intraprendere. Sono sicuro che sia sbagliato.

Grazie.

risposta

3

Capito.

La chiave è creare un componente DataFlavor per drop target. Quindi qui ho 4 obiettivi che accettano gocce di tipo foo, 3 pulsanti e 1 pannello.

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") 

Ho deciso di concludere la mia classe di stato Foo.

E rendere questo wrapper implementa un'interfaccia personalizzata che ho chiamato TransferDataStrategy. In questo modo ora mi consente di eseguire diverse azioni nella funzione importData (...) per gli stessi sapori.

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

    OptionStrategy getOptionStrategy(); 
} 

miei Transferable implementazioni (che può essere pensato come la fonte della resistenza) possono ora guidare ciò che accade su goccia per lo stesso DataFlavor (o goccia di destinazione Component) restituendo strategie diverse.

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; 
     } 
    ... 
    } 
} 

Avviso Fonte Due Di seguito è anche supporta FooCopyButtonFlavor, ma restituisce una strategia diversa.

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; 
     } 
    ... 
    } 
} 

Questo è piuttosto difficile da spiegare, ma si spera che potrebbe essere d'aiuto.