2010-06-17 62 views
5

問題是關於Java 5和Drag n Drop。如何找到拖放目標TransferHandler中的拖動源組件?

有沒有辦法確定拖放源組件中的放置目標TransferHandler

我需要知道這在我的canImport(..)importData(..)方法,以採取不同的動作傳輸相同類型的數據或DataFlavor

我當前已達到了這個問題的方法是劫持的DataFlavor「人類可讀場」,並設置一個串動,造成這樣的事情:

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

然後使用這個字段來決定採取何種行動。 我很肯定這是錯誤的。

謝謝。

回答

3

想通了。

關鍵是要創建一個DataFlavor每滴目標組件。所以在這裏我有4個接受foo,3個按鈕和1個面板的液滴的目標。

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

我決定包裝我的Foo狀態類。

並使該包裝器實現一個名爲TransferDataStrategy的自定義接口。現在這樣做可以讓我在importData(...)函數中爲相同的風味執行不同的操作。

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

    OptionStrategy getOptionStrategy(); 
} 

Transferable實現(這可以被認爲是作爲拖動源)現在可以開什麼通過返回不同的策略在發生跌落爲同一DataFlavor(或降目標組件)。

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

注意源碼2下面還支持FooCopyButtonFlavor,但是會返回不同的策略。

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

這是很難解釋,但希望它可以幫助。