Transferableとは?
前回、テキストのクリップボード利用について簡単に説明をしました。テキスト(マルチフォントでない、標準テキスト)のクリップボード利用は、非常に簡単です。必要な機能(クラス類)がすべて標準で付属しているのですから。が、それ以外のものの場合には、Transferableクラスを独自に定義して利用することになります。
では、イメージの読み込み用Transferableクラスを作成してみましょう。
class ImageSelection implements Transferable {
private BufferedImage image;
private DataFlavor[] flavor;
public ImageSelection(BufferedImage image){
this.image = image;
flavor = new DataFlavor[]{DataFlavor.imageFlavor};
}
public synchronized DataFlavor[] getTransferDataFlavors(){
return flavor;
}
public boolean isDataFlavorSupported(DataFlavor flavor){
return this.flavor[0].equals(flavor);
}
public synchronized Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if (!this.flavor[0].equals(flavor)){
throw new UnsupportedFlavorException(flavor);
}
return image;
}
}
Transferableをimplementsしたクラスでは、「getTransferDataFlavors」「isDataFlavorSupported」「getTransferData」といったメソッドを用意する必要があります。
このImageSelectionでは、privateフィールドに、イメージであるBufferedImageと、DataFlavorの配列を保持するようにしてあります。コンストラクタでは、これらのprivateフィールドにそれぞれ値を設定していますね。BufferedImageは、そのまま引数で渡されたものを設定します。またDataFlavor配列は、イメージのDataFlaverであるDataFlavor.imageFlavorを要素に持つ配列を作成して設定しておきます。
各メソッドの処理は、それほど難しいものではありません。getTransferDataFlavorsはDataFlavor配列をそのまま返すだけですし、isDataFlavorSupportedは引数で渡されたDataFlavorが、保管しているDataFlavor配列の要素と同じかどうかをチェックするだけです。またgetTransferDataも、DataFlavorが同じならば保管してあるBufferedImageを返します。
これで、イメージ用のTransferableが用意できました。後は、これを使ってクリップボードとやり取りをすればよいのです。