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