java從1.5版開始已經能與系統的剪切板很好的交互了。java
若是能夠在程序中直接調用系統的剪切板來保存「複製」的對象內容,那能夠說的比以前的想法好不少。this
下面是一個對java.io.File對象進行copy,paste操做的例子,雖然還不完善,但能夠在程序中很好的使用。spa
/* * 定義爲傳輸操做提供數據所使用的類的接口 * 專用於java.io.File類型 */ package angel.datatransfer; import java.awt.datatransfer.*; import java.io.*; import angel.*; public class FileTransfer implements Transferable { private File file; public FileTransfer(File file) { this.file=file; } public Object getTransferData(DataFlavor flavor) { if(isDataFlavorSupported(flavor)) { return file; } else { return null; } } public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] { new DataFlavor( file.getClass(), DataFlavor.javaJVMLocalObjectMimeType)}; } public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.isMimeTypeEqual(DataFlavor.javaJVMLocalObjectMimeType); } } //在點擊「複製」菜單是,調用: Transferable trans = new FileTransfer(this.getSelectedFile()); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null); //返回Clipboard剪切板當前的數據 public Object getClipboardData() { try { Transferable tran=Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); if(tran.isDataFlavorSupported(new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType))) { Object obj=tran.getTransferData(new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType)); if(obj instanceof File) { return (File)obj; } else { return null; } } else { return null; } } catch(Exception err) { err.printStackTrace(); return null; } }
另外還發現一個功能,在Java程序中還能夠簡單的監視系統剪切板裏的內容變化,不過若是重複複製同一種類型的數據,好比複製了兩次不一樣內容的文本,只會觸發一次事件:code
//開啓系統剪切板的偵聽器,偵聽器的目標Clipboard更改時調用 Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(this); //開啓系統剪切板的偵聽器,偵聽器的目標Clipboard更改時調用 public void flavorsChanged(FlavorEvent e) { try { Transferable tran=Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); System.out.println(tran); } catch(Exception err) { err.printStackTrace(); } }