弄清楚了。
关键是为每个放置目标组件创建一个 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;
}
...
}
}
注意下面的源二也支持 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;
}
...
}
}
这很难解释,但希望它可能会有所帮助。