想通了。
关键是要创建一个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;
}
...
}
}
这是很难解释,但希望它可以帮助。