2012-05-07 8 views
3

小さいコンポーネントが積み重なっているコンポーネントで作業しています。ユーザーはドラッグアンドドロップを使用してこれらのコンポーネントの順序を変更できる必要があります。私は、基礎となるデータモデルのローカル参照DataFlavorjavaJVMLocalObjectMimeType)を受け入れるTransferHandlerを実装して、この作業を行ってきました。これは正常に動作します。javaDVMLocalObjectMimeTypeをローカルDnDに使用し、外部ドロップのシリアライズ

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

オブジェクト参照またはデータのシリアル化バージョンを使用することを決定できるように、ドラッグ操作が同じJVMで行われるかどうかを決定するにはどうすればよいですか。公式のスイング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); 
} 

を行う方法です私が1つのインスタンスから別のインスタンスにドラッグするとドラッグが受け入れられ、ドクターのjava.io.IOException: Owner failed to convert dataにつながりますオペレーションアプリケーションおよびjava.io.NotSerializableException: alignment.model.DataModelをドラッグソースアプリケーションに追加します。これは問題ありませんが、最初は別のアプリでドラッグを受け入れるべきではありません。

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

+0

私がjavaJVMLocalObjectMimeTypeを使用しようとしたとき、アプリケーションの2番目のインスタンスに落としたときに私が見たのは、私の 'canImport'で' isDataFlavorSupported'呼び出しが 'true'を返したというものでしたが、' getTransferable.getTransferData' importData'が 'null'を返しました。 – Suma

答えて

1

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

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

、この味は、ドラッグソースとの間に等しいと考えていませんそれらが同じJVM内にない場合は、ドロップターゲットとなります。

Serializableを実装するクラスでは、ローカルオブジェクトリファレンスフレーバーを直接使用することはできません。誰かがこれが文書化されている場所を知っていれば、それについて聞いてうれしいです。

0

オブジェクト参照フレーバーは通常、実行中のJVMごとに異なります。したがって、最初にTransferableがあなたの 'オブジェクトリファレンスフレーバー'をサポートしているかどうかを確認してから、 'serialized dataflavor version'を求めます。

+0

それも私が期待していたものですが、うまくいきません。最初のインスタンスからの私のローカル参照フレーバーも2番目のインスタンスで受け入れられます。 – Moritz

+0

@Moritzはローカル参照フレーバの作成方法を示す質問にいくつかのコードを含めることができます – Robin

関連する問題