Java监视系统剪贴板

来源:互联网 发布:淘宝客如何设置优惠券 编辑:程序博客网 时间:2024/04/30 10:46

为工作方便写了个小工具,需要监视系统剪贴板,如果文本内容变化,则自动处理并存入剪贴板。

FlavorListener仅在剪贴板中的数据类型变化时才生效。

改用ClipboardOwner接口,将它注册到剪贴板,当剪贴板中的内容变化时,当前对象失去了所有权,会自动调用接口中的lostOwnership(Clipboard clipboard, Transferable contents)方法,从而达到监控剪贴板的目的。


import java.awt.Toolkit;import java.awt.datatransfer.Clipboard;import java.awt.datatransfer.ClipboardOwner;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.StringSelection;import java.awt.datatransfer.Transferable;import java.awt.datatransfer.UnsupportedFlavorException;import java.io.IOException;/** * 剪贴板监控器 * 负责对剪贴板文本的监控和操作 * 由于监控需要一个对象作为ClipboardOwner,故不能用静态类 * */public class SystemClipboardMonitor implements ClipboardOwner{    private Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();        public SystemClipboardMonitor(){        //如果剪贴板中有文本,则将它的ClipboardOwner设为自己        if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)){            clipboard.setContents(clipboard.getContents(null), this);        }    }        /************     * 测试代码 *     * **********     */    public static void main(String[] args) {        SystemClipboardMonitor temp = new SystemClipboardMonitor();        new JFrame().setVisible(true); // 软件窗口    }    /**********************************************     * 如果剪贴板的内容改变,则系统自动调用此方法 *     **********************************************     */    @Override    public void lostOwnership(Clipboard clipboard, Transferable contents) {        // 如果不暂停一下,经常会抛出IllegalStateException        // 猜测是操作系统正在使用系统剪切板,故暂时无法访问        try {            Thread.sleep(1);        } catch (InterruptedException e) {            e.printStackTrace();        }        // 取出文本并进行一次文本处理        String text = null;        if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)){            try {                text = (String)clipboard.getData(DataFlavor.stringFlavor);            } catch (UnsupportedFlavorException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }        String clearedText = Text.handle(text); // 自定义的处理方法        // 存入剪贴板,并注册自己为所有者        // 用以监控下一次剪贴板内容变化        StringSelection tmp = new StringSelection(clearedText);        clipboard.setContents(tmp, this);    }}




0 0
原创粉丝点击