3

小さなコンポーネントが積み重ねられたコンポーネントに取り組んでいます。ユーザーは、ドラッグ アンド ドロップを使用してこれらのコンポーネントの順序を変更できる必要があります。基になるデータ モデルのローカル参照DataFlavor( )を受け入れる TransferHandler を実装することで、これを機能させました。javaJVMLocalObjectMimeTypeこれはうまくいきます。

ここで、アプリケーションをもう一度実行して、コンポーネントをあるアプリケーションから別のアプリケーションにドラッグできるようにしたいと考えています。この場合、ドラッグ ソースの必要なデータをシリアライズ可能なオブジェクトにバンドルして、ドロップ アプリケーションでオブジェクトを再構築し、そのためにシリアライズ可能な DataFlavor を使用します。両方の状況でオブジェクトのシリアル化を使用したくありません。

オブジェクト参照またはシリアル化されたバージョンのデータを使用することを決定できるように、ドラッグ操作が同じ JVM で発生したかどうかを判断するにはどうすればよいですか。公式の swing DnD ドキュメントには、ローカルとシリアライゼーションのフレーバーを混在させることが可能であると記載されていますが、これを最大限に活用する方法については説明されていません。

編集

これが私が自分でフレーバーを作成する方法ですDataModelTransferable

public static DataFlavor localFlavor;

static {
    try {
        localFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=\"" +  ArrayList.class.getName() + "\"");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
...
@Override
public DataFlavor[] getTransferDataFlavors() {
    return new DataFlavor[] { localFlavor };
}

そして、TransferHandler私はこれを行います

@Override
public boolean canImport(TransferSupport support) {
    return support.isDataFlavorSupported(DataModelTransferable.localFlavor);
}

前述したように、これはローカルでは正常に機能しますが、あるインスタンスから別のインスタンスにドラッグすると、ドラッグが受け入れられ、java.io.IOException: Owner failed to convert dataオン ドロップ アプリケーションとjava.io.NotSerializableException: alignment.model.DataModelオン ドラッグ ソース アプリケーションが発生します。これは問題ありませんが、ドラッグはそもそも別のアプリで受け入れられるべきではありません。

ArrayList一度に複数のオブジェクトをドラッグできるようにしたいので、を使用しています。

4

2 に答える 2

2

私はちょうど問題が何であるかを自分で見つけました。DataModelList私は実装しない DataModels の ArrayList のラッパー クラスをSerializable作成し、データ フレーバーの宣言を次のように変更しました。

localFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=\"" +  DataModelList.class.getName() + "\"");

その後、同じ JVM 内にない場合、このフレーバーはドラッグ ソースとドロップ ターゲットの間で等しいとは見なされません。

を実装するクラスでローカル オブジェクト参照フレーバーを直接使用することはできないと結論付けていますSerializable。誰かがこれが文書化されている場所を知っているなら、私はそれについて聞いてうれしいです.

于 2012-05-08T09:39:20.777 に答える
0

通常、オブジェクト参照のフレーバーは、実行中の JVM ごとに異なります。Transferableしたがって、「シリアル化されたデータフレーバー バージョン」を要求する前に、「オブジェクト参照フレーバー」がサポートされているかどうかを最初に確認します。

于 2012-05-07T16:53:03.110 に答える