Clipboardクラスの利用方法


アプリケーション間のデータのやり取りを行うとき、基本となるのが「クリップボード」です。多くのアプリケーションでは、クリップボードに必要なデータをコピーし、他のアプリケーションに切り替えてそれをペーストしてデータをやり取りします。

Javaの場合も、この基本は変わりません。が、Javaでプログラムを作成する場合、あまりこのクリップボードというものを意識することはないはずです。なぜなら、AWT/Swingに用意されているテキスト編集用のコンポーネントでは、標準でクリップボードによるカット、コピー、ペーストといった機能が実装されており、プログラマが自分でこれらを組み込む必要がないためです。

が、こうしたテキスト編集用のコンポーネントを使わないアプリケーションでこれらの機能を用意するような場合には、どうしてもクリップボードを利用する処理を自分で作成する必要が生じます。

Javaでクリップボードを扱うには、java.awt.datatransferパッケージの「Clipboard」というクラスを使います。ただし、これだけでクリップボードが利用できるわけではなく、これに付随して、クリップボードで扱うデータに関するクラスをいくつか利用する必要があります。では、クリップボードとのやり取りの手順について、実際のソースコードをあげながら説明をしましょう。


※クリップボードにテキストを保存する

String str = "Test"; // 保存するテキスト
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection selection = new StringSelection(str);
clipboard.setContents(selection, null);


まずは、クリップボードにテキストデータを保存する処理です。最初に、システムのクリップボードを扱うためのClipboardインスタンスを取得します。これは、Toolkitの「getSystemClipboard」メソッドを利用します。

続いて、クリップボードに値するデータを用意するため、StringSelectionクラスのインスタンスを作成します。これは、String値をクリップボードに転送するための機能をもったクラスです。引数にStringを指定してインスタンスを作成することで、そのString値をクリップボードに渡すためのStringSelectionインスタンスが用意できます。

最後に、Clipboardの「setContents」で、StringSelectionをクリップボードに設定します。これは、第1引数にクリップボードに転送可能なオブジェクト(Transferableインスタンス)、第2引数にクリップボードのオーナーを示す「ClipboardOwner」インスタンスを指定します。ここでは、作成してあるStringSelectionインスタンスがTransferableインスタンスとして扱えますから、これをそのまま指定します。ClipboardOwnerにはnullを指定しておきます。


※クリップボードからテキストを受け取る

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable object = clipboard.getContents(null);
String str = "";
try {
  String str = (String)object.getTransferData(DataFlavor.stringFlavor);
} catch(UnsupportedFlavorException e){
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}


クリップボードからデータを受け取る場合には、例外処理などがからんでくるのでちょっとだけ複雑になります。まず、ToolkitのgetSystemClipboardからClipboardインスタンスを取得します。

続いて、「getContents」メソッドを呼び出し、クリップボードからデータのオブジェクトを取り出します。これは、Transferableインスタンスとして取り出されます。このgetContentsでは、引数に、クリップボードのデータを利用するオブジェクトを示すObjectインスタンスが渡されますが、これは現時点では使われていないため、nullを指定しておきます。

こうして取り出されたTransferableインスタンスから、「getTransferData」メソッドでデータを取り出します。ここでは、引数として、取り出すデータの種類に関するDataFlavor(データのメタ情報クラス)を指定します。テキストのデータを取り出す場合には、テキストデータをJavaのString値として取り出すための「DataFlavor.stringFlavor」というものを指定します。

ただし、クリップボードに入っているデータは、テキストとして取り出せるものだけではありません。もしテキストとして取り出せないデータが入っていた場合には、UnsupportedFlavorExceptionという例外が発生します。このため、クリップボードの処理は必ずtry内で実行する必要があります。