核心功能说明:
设置剪切板内容并指定所有者: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);
}
}
效果演示: