zl程序教程

您现在的位置是:首页 >  Java

当前栏目

Java 技术篇-利用ClipboardOwner实现实时监听剪切板功能实例演示

2023-03-20 15:36:45 时间

核心功能说明: 设置剪切板内容并指定所有者:clipboard.setContents(); 当所有者为程序本身时才能监听到剪切板的变动,每次系统执行复制或剪切动作时会自动的更改剪切板的所有者,所以每次监听完成都要重新指定所有者才能保证不断的进行监听。

获取剪切板的内容:clipboard.getContents(null) 指定剪切板所有者时必须指定剪切板的内容,每次设置时还是指定当前剪切板的内容,达到一个剪切板内容不变的效果。

package com.test.test;

import java.awt.Toolkit;
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.io.IOException;

public class ReadClipboard implements ClipboardOwner{
    /*
    作者:小蓝枣
    日期:2020.11.11
    作用:监听剪切板
    返回:剪切板的文本内容
    */

    // 获取系统剪切板
    private Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

    public ReadClipboard(){
        // 将剪切板的所有者设置为自己
        // 当所有者为自己时,才能监控下一次剪切板的变动
        // clipboard.getContents(null) 获取当前剪切板的内容
        clipboard.setContents(clipboard.getContents(null), this);
    }

    public static void main(String[] args) throws InterruptedException {
        ReadClipboard temp = new ReadClipboard();
        Thread.currentThread().sleep(1000000);
    }

    // 重写 lostOwnership 方法
    // 当有内容写入剪切板时会调用该方法
    @Override
    public void lostOwnership(Clipboard clipboard, Transferable contents) {
        // 延迟1s执行,如果立即执行会报错,系统还没使用完剪切板,直接操作会报错
        // IllegalStateException: cannot open system clipboard
        try {
            Thread.sleep(1000);
        } 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();
            }
        }
        System.out.println(text);

        // 不影响剪切板内容
        // 每次剪切板变动,剪切板的所有者会被剥夺,所以要重新设置自己为所有者,才能监听下一次剪切板变动
        clipboard.setContents(clipboard.getContents(null), this);
    }
}

效果演示: