Javaでクリップボードに複数の形式でコピー
クリップボードは複数のデータ形式を保持することができますが、JavaのAPIには、
文字列用のクラス(StringSelection)しかありません。
なので、複数の任意のデータ形式を扱えるクラスを作ってみました。
/* * 作成日: 2009/10/18 */ package util; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * クリップボードの内容を保持します。 * 複数の様々なデータ形式をサポートします。 * 独自のデータ形式を扱うことも可能です。 */ public class ClipboardContents implements Transferable, ClipboardOwner { private Map map = new HashMap(); public ClipboardContents() {} /** * クリップボードにデータを登録します。 */ public void put(DataFlavor flavor, Object data) { map.put(flavor, data); } /** 転送されるデータを表すオブジェクトを返します。*/ public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { Object result = map.get(flavor); if (result != null) return result; throw new UnsupportedFlavorException(flavor); } /** データを提供することができるフレーバを示す DataFlavor オブジェクトの配列を返します。 */ public DataFlavor[] getTransferDataFlavors() { Set set = map.keySet(); DataFlavor[] result = new DataFlavor[set.size()]; Iterator ite=set.iterator(); for (int i=0; i<result.length; i++) { result[i] = (DataFlavor) ite.next(); } return result; } /** 指定されたデータフレーバが、このオブジェクトに対してサポートされているかどうかを返します。 */ public boolean isDataFlavorSupported(DataFlavor flavor) { return map.keySet().contains(flavor); } /** クリップボードの内容のオーナではなくなったことを、このオブジェクトに通知します。*/ public void lostOwnership(Clipboard clipboard, Transferable contents) { map.clear(); } }
使い方はこうです。文字列とファイルリストの2種類をコピーしています。
String strdata = ... List filelist = ... // 要素はFile // クリップボードにコピー Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); ClipboardContents cc = new ClipboardContents(); cc.put(DataFlavor.stringFlavor, strdata); cc.put(DataFlavor.javaFileListFlavor, filelist); clipboard.setContents(cc, cc);