Разобрался.
Ключ заключается в создании 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 State.
И сделать эту обертку реализует пользовательский интерфейс, который я назвал 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;
}
...
}
}
Обратите внимание, что Источник Два Ниже также поддерживает 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;
}
...
}
}
Это довольно сложно объяснить, но, надеюсь, это может помочь.