核心功能说明:
设置剪切板内容并指定所有者: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); } }
效果演示:
喜欢的点个赞❤吧!