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);
}
}
效果演示:
相关文章
- java中try-catch的使用
- java基础:public是什么?
- Java中Lock原理探究以及调用过程
- eclipse导入java项目
- java求圆的面积代码
- java程序怎么运行
- java中&和&&有什么区别
- java数组怎么定义
- java中Scanner获取字符串的方法
- java项目使用eclipse建立的方法
- Java二维数组初始化的方法详解
- Java中锁有哪些面试题?
- [1076]使用IntelliJ IDEA配置Tomcat
- [1078]Win10配置Java环境变量
- [1084]windows搭建clojure开发环境
- Java基础里的@Target是什么?怎么用?
- 面试官:int和Integer有什么区别?为什么要有包装类?
- Java Review - 并发编程_JDK 8新增的原子操作类LongAdder & LongAccumulator
- Java设计模式之(十)——组合模式
- Java设计模式之(十一)——享元模式