通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。 一些用Java写的程序例如很多开发环境也可以访问到剪切板,本文就是研究如何在Java程序中读写系统剪切板的数据。 Java中使用java.awt.datatransfer.Clipboard类来描述剪切板,并把剪切板分为两种类型:本地和系统,
本地剪切板使用 Clipborad cp = new Clipboard("clip1"); 来构造;系统剪切板通过 Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard(); 获取,下面我们给出几个常用的方法用于读写剪切板中的文本数据以及图像数据 1. 从指定的剪切板中获取文本内容 protected static String getClipboardText(Clipboard clip) throws Exception{ // 获取剪切板中的内容 Transferable clipT = clip.getContents(null); if (clipT != null) { // 检查内容是否是文本类型 if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor)) return (String)clipT.getTransferData(DataFlavor.stringFlavor); } return null; } 2. 往剪切板写文本数据 protected static void setClipboardText(Clipboard clip, String writeMe) { Transferable tText = new StringSelection(writeMe); clip.setContents(tText, null); } 3. 从剪切板读取图像 public static Image getImageFromClipboard() throws Exception{ Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable cc = sysc.getContents(null); if (cc == null) return null; else if(cc.isDataFlavorSupported(DataFlavor.imageFlavor)) return (Image)cc.getTransferData(DataFlavor.imageFlavor); return null; } 4. 写图像到剪切板 protected static void setClipboardImage2(final Image image) { Transferable trans = new Transferable(){ public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] { DataFlavor.imageFlavor }; } public boolean isDataFlavorSupported(DataFlavor flavor) { return DataFlavor.imageFlavor.equals(flavor); } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if(isDataFlavorSupported(flavor)) return image; throw new UnsupportedFlavorException(flavor); } }; Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null); } 有了这四个方法,你下面可以自己写一些程序来进行测试,利用它来实现与其他程序结合测试对剪切板数据的操作。
这里给出一个用于显示图像的类,只要把Image实例作为参数传入即可。 /* * Created on 2004-12-23 * 查看图形的窗口 */ package javayou.clipboard; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.MediaTracker; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /** * @author Winter Lau 用于显示图形的窗口 */ public class ImageViewer extends Frame { private Image image; /** * 显示一个图像 * @param viewMe */ public ImageViewer(Image viewMe) { image = viewMe; MediaTracker mediaTracker = new MediaTracker(this); mediaTracker.addImage(image, 0); try { mediaTracker.waitForID(0); } catch (InterruptedException ie) { ie.printStackTrace(); System.exit(1); } addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); //窗口适应图像大小 setSize(image.getWidth(null), image.getHeight(null)); //窗口标题 setTitle("Viewing Image from Clipboard"); setVisible(true); } public void paint(Graphics graphics) { graphics.drawImage(image, 0, 0, null); } /** * 用于读取图像文件并生成Image对象 */ public static Image getImageFromFile(String fileName) { Toolkit toolkit = Toolkit.getDefaultToolkit(); Image image = toolkit.getImage(fileName); return image; } }