6

質問は、Java 5とドラッグ アンド ドロップに関するものです。

ドロップ ターゲットでドラッグ ソースコンポーネントTransferHandlerを特定する方法はありますか?

同じタイプのデータを転送するために異なるアクションを実行するには、 canImport(..)orメソッドでこれを知る必要がありますor .importData(..)DataFlavor

私が現在これを達成した方法は、DataFlavor 'Human Readable Field' をハイジャックし、文字列アクションを設定することです。結果は次のようになります。

DataFlavor localCopyFooFlavor = new DataFlavor(Foo.class, "COPY");
DataFlavor localEditFooFlavor = new DataFlavor(Foo.class, "EDIT");

次に、このフィールドを使用して、実行するアクションを決定します。これは間違っていると確信しています。

ありがとう。

4

1 に答える 1

3

理解した。

重要なのは、ドロップ ターゲット コンポーネントごとに 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;
        }
     ...
    }
}

これを説明するのは非常に難しいですが、うまくいけば役立つかもしれません。

于 2010-06-17T14:43:48.467 に答える