パッケージ java.awt.dnd
Last update: Dec. 22, 1998
Java Strikes!に戻る
JDK1.2(Java2)からjava.awt.dnd という名前のパッケージが追加されました。
これは、ドラッグ&ドロップをサポートするためのパッケージなのですが、あまり注目されていないようです。
現時点(1998年12月中旬)では、Sun のサイトにすらサンプルコードがありません。仕様書はありますが、それにもサンプルはありません。
早速いじってみて、使い方を解明してみたいと思います。
ネイティブアプリケーションからのドラッグ&ドロップ Dec. 16, 1998
試行錯誤の末、「ネイティブアプリケーションからドラッグ&ドロップしたファイル名を受け取る」方法が分かりましたのでここに掲載します。
import java.awt.Frame;
import java.awt.Dimension;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.io.*;
import java.util.List;
public class test {
public static void main(String args[]) throws Exception {
DropTarget target = new DropTarget();
target.addDropTargetListener(new DropTargetListener() {
public void drop(DropTargetDropEvent dtde) {
dtde.acceptDrop(dtde.getDropAction());
try {
Transferable trans = dtde.getTransferable();
DataFlavor flavors[] = trans.getTransferDataFlavors();
for (int i = 0; i < flavors.length; ++i) {
if (flavors[i].isFlavorJavaFileListType()) {
List list = (List) trans.getTransferData(flavors[i]);
for (int j = 0; j < list.size(); ++j) {
File file = (File) list.get(j);
System.out.println(file.getAbsolutePath());
}
System.out.println("---------------------");
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (UnsupportedFlavorException ufe) {
ufe.printStackTrace();
} finally {
dtde.dropComplete(true);
}
}
public void dragEnter(DropTargetDragEvent dtde) {}
public void dragOver(DropTargetDragEvent dtde) {}
public void dropActionChanged(DropTargetDragEvent dtde) {}
public void dragExit(DropTargetEvent dte) {}
});
Frame frame = new Frame("Drag and Drop test");
frame.setDropTarget(target);
frame.setSize(new Dimension(500, 300));
frame.setVisible(true);
}
}
|
このプログラムを実行すると、何も表示されない空のウインドウが表示されます。
ここに、ネイティブアプリケーションからファイルをドラッグ&ドロップしてみてください。(例えばWindows95の場合にはエクスプローラでドラッグ&ドロップしてください)
標準出力にドロップされたファイル名の一覧が表示されるはずです。
...えー、このプログラムは色々応用がききそうなのですが、それはまたの機会という事で...
ネイティブアプリケーションからファイルをドラッグ&ドロップ可能にするための手順を以下にまとめておきます。(Dec. 22,1998)
DropTargetのインスタンスを作成する
DropTarget target = new DropTarget();
DropTargetListenerインターフェイスを実装したクラスを作成し、DropTarget.addDropTargetListener()メソッドで登録する。
DropTargetListener dtl = new DropTargetListener() { ... }
target.addDropTargetListener(dtl);
- 最後に、ドロップ対象となる
ComponentのsetDropTarget()メソッドに上記のDropTargetオブジェクトを渡す。
Frame frame = new Frame("Drag and Drop test");
frame.setDropTarget(target);
ファイルがドロップされるとDropTargetListener.drop()メソッドが呼び出される。このメソッドでは、以下の処理を行う。
- 引数
DropTargetDropEvent dtdeのacceptDrop()メソッドを呼び出す。
dtde.acceptDrop(dtde.getDropAction());
- 引数
DropTargetDropEvent dtdeのgetTransferable()メソッドでTransferableオブジェクトを得る.
Transferable trans = dtde.getTransferable();
- 上記で得た
TransferableオブジェクトのgetTransferDataFlavors()メソッドを呼び出し、DataFlavorの配列を得る。
DataFlavor flavors[] = trans.getTransferDataFlavors();
- 上記で得られた
DataFlavorの配列の内容に対して、isFlavorJavaFileListType()メソッドを呼び出し、ドロップされたオブジェクトがファイルリストであるかを調べる。
if(flavors[0].isFlavorJavaFileListType()) {...
isFlavorJavaFileListType()メソッドがtrueを返した場合、TransferableオブジェクトのgetTransferData()メソッドを用いてDataFlavorオブジェクトをjava.util.Listオブジェクトに変換する。
java.util.List list = (java.util.List) trans.getTransferData(flavors[0]);
java.util.ListオブジェクトからFileオブジェクトを取り出し、処理を行う。
File file = (File) list.get(index);
...
- 処理が終わったら、引数
DropTargetDropEvent dtdeのdropComplete()メソッドを呼び出す。
dtde.dropComplete(true);
|
目次に戻る
DragTargetとComponent Dec. 22, 1998
Component.setDropTarget()メソッドにDropTargetのインスタンスを渡すことで、このComponentにドロップ操作が可能となりますが、この際に注意しなければならないことがあります。
それは、「DropTargetのインスタンスは1つのComponentしかサポートしない」という点です。
文章だとわかりにくいので、具体例で示しましょう。
2つのTextAreaにドロップ操作を可能とする場合の例です。
...
DropTarget target = new DropTarget();
DropTargetListener dtl = new DropTargetListener() {...};
target.addDropTargetListener(dtl);
TextArea area1 = new TextArea();
TextArea area2 = new TextArea();
area1.setDropTarget(target);
area2.setDropTarget(target);
...
|
このコードを実行すると、area2にしかドロップできません。
これは、DropTargetのインスタンスが1つのComponentしかサポートしないからです。複数のComponentに対してDropTargetをセットした場合、最後に登録したComponentのみが有効となります。
area1、area2両方にドロップ可能としたい場合には、以下のようにDropTargetのインスタンスを2つ作成します。
...
DropTarget target1 = new DropTarget();
DropTarget target2 = new DropTarget();
DropTargetListener dtl = new DropTargetListener() {...};
target1.addDropTargetListener(dtl); /** 注 **/
target2.addDropTargetListener(dtl); /** 注**/
TextArea area1 = new TextArea();
TextArea area2 = new TextArea();
area1.setDropTarget(target1);
area2.setDropTarget(target2);
...
|
注:DropTargetListenerは、複数のDropTargetからのイベントを受信できます。
目次に戻る
Java Strikes!に戻る
Copyright(C) 1998 FreeBeans