小さなコンポーネントが積み重ねられたコンポーネントに取り組んでいます。ユーザーは、ドラッグ アンド ドロップを使用してこれらのコンポーネントの順序を変更できる必要があります。基になるデータ モデルのローカル参照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
一度に複数のオブジェクトをドラッグできるようにしたいので、を使用しています。