Mac OS X上的剪贴板监控| Java的

我在Mac OS X上从系统剪贴板获取数据时遇到了麻烦。我要做的是每次在其中放入新的[基于文本的]信息时,都要收听系统剪贴板并打印剪贴板的内容。

问题:下面的代码在Windows 7和openSUSE Linux机器上运行得非常好,但是当我尝试在Mac OS X上运行相同的代码时,程序无法打印剪贴板的新内容,直到关注应用程序。 [在我点击底座上的应用程序图标之前,没有任何内容打印…]

我的源代码:

import java.awt.Toolkit; import java.awt.datatransfer.*; import java.io.IOException; public class ClipboardListener extends Thread implements ClipboardOwner { Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); public void run(){ Transferable selection = systemClipboard.getContents(this); gainOwnership(selection); } public void gainOwnership(Transferable t){ try {this.sleep(100);} catch (InterruptedException e) {e.printStackTrace();} systemClipboard.setContents(t, this); } public void lostOwnership(Clipboard clipboard, Transferable contents) { try {System.out.println((String) clipboard.getData(DataFlavor.stringFlavor));} catch (UnsupportedFlavorException e) {} catch (IOException e) {} gainOwnership(contents); } } 

 public class myApp { public static void main(String[] args){ ClipboardListener listener = new ClipboardListener(); listener.start(); while(true){}} } 

我错过了什么/做错了什么?

[更新]我在这里发现了类似的问题: Java线程在没有关注OSX的情况下进入hibernate状态但是使用命令“java -jar myApp.jar&”并不能解决我的问题。

这似乎是一个开放的bug,请参阅MACOSX_PORT-511 ClipboardOwner方法如果app没有聚焦,则不会调用lostClipboard。

似乎没有优雅的方法解决这个问题,NSPasteboard不提供剪贴板所有权概念。 您甚至无法解决编写本机Objective C.的问题。

唯一的解决方案是定期对剪贴板进行采样。