无法从 Mac OS X 上的后台 Java 应用程序监视系统剪贴板更改



我有一个java程序,在后台运行并监视系统剪贴板的变化(我通过轮询这样做,因为它似乎是除了"所有权变体"之外的唯一方法,我必须一直重置内容以成为所有者)。如果它发现一个特定格式的输入文本,它会处理该文本并用结果覆盖剪贴板(这样我就可以复制输入,然后在程序在后台运行时粘贴结果)。

到目前为止,这在Windows上工作得很好,但是当在Mac OS X上运行相同的程序时,行为有点奇怪。只要我不将结果复制到系统剪贴板中,轮询机制本身就会按预期工作。但是当我第一次将剪贴板内容从java程序中设置出来时,它只有在激活时才能识别未来的外部更改。所以我不能让它在后台运行,而是必须一直"复制输入->切换到java-program ->切换回来->粘贴结果"。

因为这很烦人,这正是我想避免的事情,通过这个"剪贴板监控->结果粘贴"方法,我将非常高兴的任何想法如何解决这个问题。

编辑:一些代码片段

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;
      }
    }
  }
}

我看到其他几个人已经尝试过你正在尝试的东西(不能从MAC OSX上的java后台应用程序复制到剪贴板),并且取得了边际成功(在java中复制到剪贴板)和一些好的答案(java/swing:剪贴板粘贴),但你可能想要进一步调查…还有谁能评论一下Java 6对这个问题的改变吗?

最新更新