我有一个java程序,它在后台运行并监视系统剪贴板的变化(我这样做是通过轮询,因为它似乎是除了“所有权变体”之外的唯一方法,我必须重置内容所有时间成为所有者)。如果它以特定格式发现输入文本,它会处理该文本并用结果覆盖剪贴板(因此我可以在程序在后台运行时粘贴结果后立即复制输入。)
到目前为止,这在Windows上运行良好,但在Mac OS X上运行相同的程序时,行为有点奇怪。只要我不将结果复制到系统剪贴板中,轮询机制本身就可以正常工作。但是目前我第一次将剪贴板内容从java程序中设置出来,它只会在变为活动状态时识别未来的外部更改。所以我不能让它在后台运行,而是我必须“复制输入 - >切换到java程序 - >切换回 - >粘贴结果”。
因为这很烦人,而这正是我希望通过这种“剪贴板监控 - >结果粘贴”方法避免的方法 - 我会非常高兴任何想法如何解决这个问题。
编辑:一些代码片段
public void setClipboardText(String text) {
if (text == null) {
throw new NullPointerException();
}
synchronized (this.lastFoundTextLock) {
this.lastFoundText = text;
Toolkit.getDefaultToolkit().getSystemClipboard()
.setContents(new StringSelection(text), null);
}
}
public String getClipboardText() {
Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().
getContents(null);
try {
if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
String text = (String) t.getTransferData(DataFlavor.stringFlavor);
return text;
}
} catch (UnsupportedFlavorException e) {
} catch (IOException e) {
}
return null;
}
public void run() {
while (true) {
String currentClipboardText = getClipboardText();
boolean isNew;
synchronized (this.lastFoundTextLock) {
isNew = ((this.lastFoundText != null) || (currentClipboardText != null))
&& ((currentClipboardText == null) || !currentClipboardText
.equals(this.lastFoundText));
if (isNew) {
this.lastFoundText = currentClipboardText;
}
}
if (isNew && currentClipboardText != null) {
//new text found
fireNewClipboardTextFound(currentClipboardText);
}
try {
Thread.sleep(this.automaticCheckInterval);
} catch (InterruptedException e) {
// ignore
}
synchronized (this.monitorRunningLock) {
if (!this.monitorRunning) {
break;
}
}
}
}
答案 0 :(得分:1)
我看到其他几个人已经尝试过您正在尝试的内容(Can't copy to a clipboard from a background java application on MAC OSX)并取得了微不足道的成功(Copying to Clipboard in Java)并且很少有好的答案(java/swing: clipboard paste),但您可能需要调查进一步......还有其他人可以评论Java 6中的这一变化吗?