Не удается отслеживать изменения системного буфера обмена из фонового Java-приложения в Mac OS X - PullRequest
2 голосов
/ 10 октября 2011

У меня есть 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;
      }
    }
  }
}

1 Ответ

1 голос
/ 13 октября 2011

Я вижу, что некоторые другие пытались выполнить то, что вы пытаетесь ( Не удается скопировать в буфер обмена из фонового Java-приложения на MAC OSX ), и имели незначительный успех ( Копирование в буфер обмена вJava ) и несколько хороших ответов ( java / swing: вставка в буфер обмена ), но вы, возможно, захотите продолжить расследование ... Кто-нибудь еще может прокомментировать изменения в Java 6 в связи с этой проблемой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...