画像を転送する


Javaクラスの転送

前回はデフォルトでサポートされている文字列の転送を行いました
しかし、クリップボードは論理的にどのようなデータも転送させることができます
つまり、画像や音声でータであっても問題はないのです

クリップボードに転送するデータは Transferable を実装しているクラスであれば
問題なく転送できるので、どのようなJavaクラスも転送できます

Transferable の二つのメソッドはすでに説明しました
getTransferData() と isDataFlavorSupported() です
これらが実装しなければいけない機能というのは、理解できているはずです
このインターフェイスは、まだあと一つ getTransferDataFlavors() を宣言しています

public abstract DataFlavor[] getTransferDataFlavors()

このメソッドは、このクラスが提供できるデータフレーバを配列で返します
データ提供の優先順位の配列となっています

カプセル化されたクラスは、そのデータを表すためのフレーバも提供する必要があります
フレーバは DataFlavor() コンストラクタから直接インスタンスを生成します

public DataFlavor( Class representationClass, String humanPresentableName )
public DataFlavor( String mimeType, String humanPresentableName )

representationClass は、データ転送に使用するクラスを
humanPresentableName はこのフレーバを識別するのために使用される文字列を指定します
2番目のコンストラクタの mimeType は MIME 形式を表現するフレーバを作成します
(MIME 形式について、この場で詳しくは説明しません)

representationClass には、一般的に Class クラスの forName() メソッドを使用します
DataFlavor の生成タイミングは自由ですが、static の静的初期化ブロックで行うことが好ましいです
import java.applet.Applet;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import java.awt.datatransfer.*;

/*	<applet code="App66.class" width="300"height="300">
	<param name="img" value="img/test.jpg">
 	</applet>
*/

public class App66 extends Applet implements ActionListener , ClipboardOwner {
	Clipboard clp;
	Button butPaste;
	Image img;

	public void init() {
		clp = new Clipboard("Kitty on your lap");
		butPaste = (Button)add(new Button("ペースト"));
		butPaste.addActionListener(this);

		ImgSelection imgClip = new ImgSelection(
			getImage(getDocumentBase() , getParameter("img"))
		);
		clp.setContents(imgClip , this);
	}

	public void actionPerformed(ActionEvent e) {
		Transferable data = clp.getContents(this);
		try { 
			img = (Image)data.getTransferData(ImgSelection.ImgFlavor);
			repaint();
		}
		catch(Exception err) {}
	}
	public void paint(Graphics g) {
		if (img != null) g.drawImage(img , 0 , 0, this);
	}
	public void lostOwnership(Clipboard clipboard , Transferable contents) {}
}

class ImgSelection implements Transferable {
	private Image img;
	static public DataFlavor ImgFlavor;
	private DataFlavor flavors[] = {ImgFlavor};

	static {
		try {
			ImgFlavor = new DataFlavor(Class.forName("java.awt.Image") , "awt-Image");
		}
		catch(Exception e) {}
	}
	public ImgSelection(Image img) {
		this.img = img;
	}

	public boolean isDataFlavorSupported(DataFlavor flavor) {
		return flavor.equals(ImgFlavor);
	}
	public synchronized DataFlavor[] getTransferDataFlavors() {
		return flavors;
	}
	public synchronized Object getTransferData(DataFlavor flavor)
			throws UnsupportedFlavorException , IOException {
		if(flavor.equals(ImgFlavor)) return img;
		else throw new UnsupportedFlavorException(flavor);
	}
}
アプレット

アプレットが起動した時点で、ローカルクリップボードを作成し
お手製の ImgSelection クラスのイメージを転送します
ペーストボタンを押すと、クリップボードから画像を読み込み表示します



前のページへ戻る次のページへ