画像を転送する
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 クラスのイメージを転送します
ペーストボタンを押すと、クリップボードから画像を読み込み表示します