カット&ペーストの処理
では、イメージのカット&ペーストの処理について考えてみましょう。ここでは、それぞれ「cut」「copy」「paste」というメソッドとして処理をまとめてみることにしましょう。
// オフスクリーン利用に以下のメソッドを準備
// public BufferedImage getOffImage();
// public void setOffImage(BufferedImage img);
public void cut(){
this.copy();
this.setOffImage(null); // イメージの設定
}
public void copy(){
BufferedImage img = this.getOffImage(); // イメージの取得
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
ImageSelection imgselection = new ImageSelection(img);
clipboard.setContents(imgselection, null);
}
public void paste(){
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable object = clipboard.getContents(null);
try {
BufferedImage image = (BufferedImage)object.getTransferData(DataFlavor.imageFlavor);
this.setOffImage(image); // イメージの設定
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
イメージを扱いますから、もともと用意されているイメージを取得したり、クリップボードから取り出したイメージを再設定したりする必要があります。とりあえずここでは、「getOffImage」「setOffImage」というメソッドを呼び出してイメージの取得・設定が行える、という形で作成をしておきました。
※カット、コピーのクリップボード処理
カットとコピーは、クリップボード関係の処理はほぼ同じです。違いは、「カットした場合には、保管していたイメージを新しくする」というだけです。ポイントは、クリップボードにイメージを設定する部分になりますね。
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
ImageSelection imgselection = new ImageSelection(img);
clipboard.setContents(imgselection, null);
クリップボード関係の処理は、この3行です。まず、ToolkitのgetSystemClipboardでClipboardインスタンスを取得します。そして、クリップボードに渡すためのImageSelectionインスタンスを作成し、ClipboardのsetContentsでImageSelectionをクリップボードに設定します。ImageSelectionさえ用意できれば、このように作業は非常に単純です。
※ペーストのクリップボード処理
ペーストの場合は、カット・コピーと逆の操作を行います。用意してあるイメージをクリップボードに設定するのですね。
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable object = clipboard.getContents(null);
// 以下、try内で実行
BufferedImage image = (BufferedImage)object.getTransferData(DataFlavor.imageFlavor);
this.setOffImage(image);
こちらも、まずはToolkitからgetSystemClipboardでClipboardインスタンスを取得します。続いて、getContentsを使ってクリップボードに保管されているデータをTransferableインスタンスとして取り出します。
ポイントは、この取り出したオブジェクトから、イメージを取り出す処理です。Transferableの「getTransferData」メソッドを使いますが、引数には「DataFlavor.imageFlavor」を指定してやります。これで、イメージのデータを取り出すことができます。取り出されたデータは、BufferedImageインスタンスにキャストして利用することができます。