目次 | 前の項目 | 次の項目 ドラッグ&ドロップ


2.4 データ転送段階

有効なドロップが発生した場合は、DropTargetListener の drop() メソッドは、ジェスチャーに関連付けられたデータの転送に取りかかります。DropTargetDropEvent は、転送されるデータオブジェクトを表す Transferable オブジェクトを取得する手段を提供します。

まず、drop() メソッドにより、DropTargetListener が、 rejectDrop() を呼び出してドロップを拒否するか (この場合はすぐに復帰する)、または getSourceActions() によって返された操作から選択された操作を指定する acceptDrop() を呼び出してドロップを受け入れます。

acceptDrop() のあとは、getTransferable() が呼び出され、返された Transferable の getTransferData() メソッドを介してデータ転送が行われます。最後に、復帰する前に、drop() メソッドは、dropComplete() の呼び出しによって転送が成功したことを知らせます。

drop() メソッドから復帰するときに、Transferable および DragSourceContext のインスタンスがまだ有効であるという保証がないので、そのあと、これらのインスタンスを順にガベージコレクトできるように、受け取り側によるインスタンスへのすべての参照が破棄されます。

ACTION_REFERENCE 操作を使う場合は、転送元と転送先でオブジェクトおよび関連付けられた転送のセマンティクスを一致させる必要があります。一般に、JVM 内の転送では、転送元と転送先の間でライブオブジェクト参照が渡されますが、JVM 間の転送、またはネイティブアプリケーションと Java アプリケーションの間では、ライブオブジェクト参照は無意味で、URL などのほかの参照の種類が交換されます。転送が JVM 内の転送かどうかは、 DragSource と DropTarget の両方で検出できます。


2.4.1 FlavorMap および SystemFlavorMap

ターゲットとなるすべてのドラッグ&ドロッププラットフォームは、同様の機構を使って転送データの型を表しますが、この表現方法には違いがあります。Java プラットフォームでは、DataFlavor 内にカプセル化された MIME 形式を使ってデータ型を表します。Java とプラットフォームにネイティブなアプリケーションとの間でのデータ転送を許可するには、これらのプラットフォーム名の存在が公開される必要があります。このため、これらのプラットフォームに依存する型名、それらの表現方法、および Java MIME ベースの DataFlavors 間で、プラットフォームに依存しない拡張可能なマッピングを作成するための機構が必要です。

この実装は、プラットフォームにネイティブなデータ型 (文字列) と DataFlavors の構築に使われる MIME 形式 (文字列) との間のマッピングを外部で指定する機構を提供します。この外部マッピングは、背後のプラットフォームのドラッグ&ドロップ機構によって転送元から転送先にエクスポートされる適切な DataFlavors (MIME 形式) を公開するために、背後のプラットフォーム固有の実装コードで使われます。

背後のシステムは、DragSource クラスおよび DropTarget クラスのどちらを使っても、プラットフォームに依存する名前と DataFlavors 間のマッピングにアクセスできます。

public interface FlavorMap {
	java.util.Map getNativesForFlavors(DataFlavor[] dfs);
	java.util.Map getFlavorsForNatives(String[] natives);
}


getNativesForFlavors() メソッドは、DataFlavor の配列をパラメータにとり、実パラメータ dfs から、関連付けられた String 型の値 (その MIME 形式に対応するプラットフォームに依存する型名に一致) とともに、DataFlavor 型のゼロ個以上のキーを含む Map オブジェクトを返します。 getFlavorsForNatives() メソッドは、String 型の配列をパラメータにとり、実パラメータ natives から、関連付けられた DataFlavor 型の値 (そのプラットフォームに依存する型名に対応するプラットフォームに依存しない型名に一致) とともに、String 型のゼロ個以上のキーを含む Map オブジェクトを返します。

これらのメソッドによって返される Map オブジェクトは可変の場合もありますが、必ずしもその必要はありません。

たとえば、Win32 では、シンプルテキストのクリップボード形式の名前は、CF_TEXT (実際にはこれは整数 1) ですが、Motif では、STRING という名前の X11 Atom です。MIME 形式を使ってこれを表現する場合は、text/plain charset=us-ascii です。プラットフォームに対する移植性のある FlavorMap は、Win32 上の CF_TEXT と Motif/X11 上の STRING 間のマッピングを行います。

一般に、これらのマッピングは、SystemFlavorMap に実装する時に、外部の固定された設定形式 (プロパティファイルまたは URL) に保持し、プラットフォームからロードして、特定のプラットフォームに適切に FlavorMap を設定するようにします。

SystemFlavorMap クラスは、全システムに共通なマッピングのセットを指定するための、プラットフォームで設定が可能な単純な機構を実装するために提供されています。次のように定義されています。

public class SystemFlavorMap implements FlavorMap {
	public static FlavorMap getSystemFlavorMap();

	public synchronized Map 
		getNativesForFlavors(DataFlavor[] dfs);

	public synchronized Map
		getFlavorsForNatives(String[] natives);

	public static String
		encodeJavaMIMEType(DataFlavor df);

	public static String
		encodeJavaMimeType(java.util.mime.MimeType mime);

	public static boolean
		isEncodedJavaMimeType(String mimeStr);

	public static DataFlavor
		createFlavorFromEncodedJavaMimeType(String ejmts);

	public static java.util.mime.MimeType
		createMimeTypeFromEncodedJavaMimeType(
							String ejmts
		);
}

SystemFlavorMap クラスは、固定プラットフォームの FlavorMap のプロパティファイル (java.awt.Properties を参照) を使って、単純な実装を提供します。このクラスは、AWT のプロパティである AWT.flavorMapFileURL (Toolkit.getProperty() を参照) の値か、または System.getProperty("java.home") + File.separator + "lib" + File.separator + "flavormap.properties" のデフォルトのファイル位置を使って、そのプロパティから適切な Map を作成します。

さらに、このクラスは、Java MimeType とプラットフォームに依存した名前空間のコード化または復号化に使う、いくつかの有用な静的機能を提供します。プロパティファイルの構文は、次のとおりです。

{ <platform_type_name> `=' <IETF_MIME_RFC_conformant_specification> <nl> } *

DragSouce および DropTarget のデフォルトの実装は、getFlavorMap() メソッドから SystemFlavorMap を返します。



目次 | 前の項目 | 次の項目
Copyright © 1997 Sun Microsystems, Inc. All Rights Reserved.