想通了。
關鍵是要創建一個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;
}
...
}
}
這是很難解釋,但希望它可以幫助。