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が用意できました。後は、これを使ってクリップボードとやり取りをすればよいのです。