在Java中调用与系统有关的剪切板Clipboard
java从1.5版开始已经能与系统的剪切板很好的交互了。
如果可以在程序中直接调用系统的剪切板来保存“复制”的对象内容,那可以说的比之前的想法好很多。
下面是一个对java.io.File对象进行copy,paste操作的例子,虽然还不完善,但可以在程序中很好的使用。
/* * 定义为传输操作提供数据所使用的类的接口 * 专用于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程序中还可以简单的监视系统剪切板里的内容变化,不过如果重复复制同一种类型的数据,比如复制了两次不同内容的文本,只会触发一次事件:
//开启系统剪切板的侦听器,侦听器的目标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(); } }