java监听剪贴板_Java监视系统剪贴板
为工作方便写了个小工具,需要监视系统剪贴板,如果文本内容变化,则自动处理并存入剪贴板。
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);
}
}
还没有评论,来说两句吧...