理解した。
重要なのは、ドロップ ターゲット コンポーネントごとに DataFlavor を作成することです。ここでは、タイプ foo のドロップを受け入れる 4 つのターゲット、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;
}
...
}
}
これを説明するのは非常に難しいですが、うまくいけば役立つかもしれません。