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

标签 java macos clipboard

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

到目前为止,这在 Windows 上运行良好,但在 Mac OS X 上运行相同的程序时,行为有点奇怪。只要我不将我的结果复制到系统剪贴板中,轮询机制本身就会按预期工作。但是目前我第一次将剪贴板内容设置在 java 程序之外,它仅在激活时才识别 future 的外部更改。所以我不能让它在后台运行,而是我必须一直“复制输入 -> 切换到 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;
      }
    }
  }
}

最佳答案

我看到其他几个人已经尝试过您正在尝试的事情 (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 变化的评论吗?

关于java - 无法从 Mac OS X 上的后台 Java 应用程序监视系统剪贴板更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7717824/

相关文章:

java - 为什么这个程序会抛出ClassCastException?

c++ - 在 C++ 中以原始格式获取剪贴板数据

c++ - 在 Windows 中设置全局剪贴板文本, native C++

c# - 仅存在于任务栏中的 Windows 应用程序

Java 如何等待线程退出或用户按 Enter 键

java - 如何在socket.send函数中进行变量替换

Java 泛型 - 将可分配的捕获类型转换为子类

macos - 如何构建 dmg Mac OS X 文件(在非 Mac 平台上)?

macos - 如何销毁(解除分配)从 nib 文件加载的 View 项的实例

windows - 从 PHPmyadmin 从 Windows 到 Mac 的数据库