[关闭]
@marlin 2016-08-13T12:28:00.000000Z 字数 1997 阅读 2393

小工具----监控剪切板

工具 tool 剪切板


监控剪切板可以通过ClipboardOwner实现。简单实现逻辑如下:

  1. import java.awt.Toolkit;
  2. import java.awt.datatransfer.Clipboard;
  3. import java.awt.datatransfer.ClipboardOwner;
  4. import java.awt.datatransfer.DataFlavor;
  5. import java.awt.datatransfer.StringSelection;
  6. import java.awt.datatransfer.Transferable;
  7. import java.awt.datatransfer.UnsupportedFlavorException;
  8. import java.io.IOException;
  9. import javax.swing.JFrame;
  10. /**
  11. * 剪贴板监控器
  12. * 负责对剪贴板的监控和操作
  13. * 由于监控需要一个对象作为ClipboardOwner,故不能用静态类
  14. * 不用FlavorListener是因为它仅监控剪贴板中数据类型的变化
  15. */
  16. public class SystemClipboardMonitor implements ClipboardOwner{
  17. private Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
  18. private boolean going; //控制开关
  19. /*****************
  20. * 开始监视剪贴板 *
  21. * ***************/
  22. public void begin(){
  23. going = true;
  24. //将剪贴板中内容的ClipboardOwner设置为自己
  25. //这样当其中内容变化时,就会触发lostOwnership事件
  26. clipboard.setContents(clipboard.getContents(null), this);
  27. }
  28. /*****************
  29. * 停止监视剪贴板 *
  30. * ***************/
  31. public void stop(){
  32. going = false;
  33. }
  34. /************
  35. * 测试代码 *
  36. * **********/
  37. public static void main(String[] args) {
  38. SystemClipboardMonitor tmp = new SystemClipboardMonitor();
  39. tmp.begin(); //开始监视
  40. new JFrame().setVisible(true);// 软件窗口
  41. }
  42. /*******************************************
  43. * 如果剪贴板的内容改变,则系统自动调用此方法 *
  44. *******************************************/
  45. public void lostOwnership(Clipboard clipboard, Transferable contents) {
  46. if (going){ //如果是进行中状态,则操作
  47. // 如果不暂停一下,经常会抛出IllegalStateException
  48. // 猜测是操作系统正在使用系统剪切板,故暂时无法访问
  49. try {
  50. Thread.sleep(1);
  51. } catch (InterruptedException e) {
  52. e.printStackTrace();
  53. }
  54. // 取出文本并进行一次文本处理
  55. // 如果剪贴板中有文本:
  56. if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)){
  57. try {
  58. String text = (String)clipboard.getData(DataFlavor.stringFlavor);
  59. // 存入剪贴板,并注册自己为所有者
  60. // 这样下次剪贴板内容改变时,仍然可以触发此事件
  61. String clearedText = translateLatex(text);
  62. StringSelection tmp = new StringSelection(clearedText);
  63. clipboard.setContents(tmp, this);
  64. } catch (UnsupportedFlavorException e) {
  65. e.printStackTrace();
  66. } catch (IOException e) {
  67. e.printStackTrace();
  68. }
  69. } else {
  70. // 如果剪贴板中没有文本,仍然将自己设置为它的ClipboardOwner
  71. clipboard.setContents(clipboard.getContents(null), this);
  72. }
  73. }
  74. }
  75. private String translateLatex(String l){
  76. //TODO do something
  77. return l;
  78. }
  79. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注