目次 | 前の項目 | 次の項目 | ドラッグ&ドロップ |
特定の基本的なプラットフォームのドラッグ&ドロップ、およびウィンドウシステムの実装には制限があるため、ドラッグ操作の対話、および AWT コンポーネントへのイベント送信のセマンティクスは、プラットフォームに依存しています。このため、ドラッグ操作中に DragSource がそのドラッグに属するプラットフォームのウィンドウシステムイベントの処理を行い、通常のイベント処理が排除されることがあります。プラットフォームネイティブなドラッグ&ドロップシステムのシングルスレッドの処理部と、AWT 内の実装を担当するネイティブなウィンドウシステムイベントの相互作用により、DropTargetListener、および DragSourceListener への「コールバック」は、AWT システムイベントを処理するスレッド上か、またはスレッドと同期して発生します。これは、セキュリティの面で望ましくない動作ですが、構造ではなく実装上の特徴なので、避けることができません。
JVM* 内のドラッグ&ドロップ転送を可能にするため、既存の DataFlavor クラスは、直列化された持続的表現ではなく、「ライブ」オブジェクト参照の型を表現できるように拡張されます。このようなオブジェクトは、同じ JVM、および ClassLoader コンテキスト内にある転送元と転送先の間で転送されます。MIME コンテンツタイプは、application/x-java-local-objectref になります。
Transferable オブジェクト、それに関連付けられた DataFlavor、およびドラッグ&ドロップ操作のオペランドに指定された基本的なデータをカプセル化するオブジェクトは、少なくとも、操作を制御する DragSource に関連付けられた DragSourceListener が dragDropEnd() イベントを受け取るまで有効です。転送元と転送先の間での操作対象のライフタイムは、その時点を過ぎて定義される実装です。
正常に終了したドラッグ&ドロップ (ACTION_MOVE) 操作の「転送元」は、転送が正常に完了したあと、すぐに Transferable の対象であるオブジェクトへの参照を削除または放棄する必要があります。それは、DragSourceListener.dragDropEnd() 通知から戻る前です。
以前のバージョンの仕様に対する開発者からのフィードバックの結果、動作タグ ACTION_REFERENCE が追加されました。このタグにより、既存のプラットフォームのドラッグ&ドロップ「リンク」セマンティクスを含めることができます。参照、つまりリンクのセマンティクスは、プラットフォームネイティブのドラッグ&ドロップにとって非常に不都合なものであるため、ネイティブのアプリケーション間でさえも本質的に使い物にならなくなっているといわれています。このため、ネイティブとプラットフォームに依存しない Java アプリケーションとの間では、このセマンティクスの使用は推奨されません。
Java 対 Java で使用する場合、求められるセマンティクス (同一の JVM および ClassLoader 内) は、転送先が転送対象への Java オブジェクト参照を取得するように定義されています。JVM または ClassLoader 間では、セマンティクスの実装は定義済みですが、転送元から転送先に URL を送るか、RMI「リモート」参照によって実装することもできます。
* この Web サイトで使用されている用語「Java 仮想マシン」または「JVM」は、Java プラットフォーム用の仮想マシンを表します。