Сценарий
Я использую FlavorListener для переключения кнопки при изменении типа контента буфера обмена. Прослушиватель вызывает Clipboard#getAvailableDataFlavors, который непоследовательно выдает исключение IllegalStateException, когда я копирую данные из других программ, говоря: «Невозможно открыть системный буфер обмена».
MVCE
Чтобы воспроизвести проблему, запустите приведенную ниже программу и скопируйте данные в системный буфер обмена из другой программы (вам может потребоваться несколько попыток копирования). до того, как будет выбрано исключение):
Код: Выделить всё
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.FlavorListener;
import java.util.Arrays;
import java.util.Scanner;
public class Foo {
public static void main(String[] args) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
FlavorListener listener = e -> System.out.print("\rClipboard has text: "
+ Arrays.stream(clipboard.getAvailableDataFlavors()).anyMatch(DataFlavor::isFlavorTextType)
+ "\nPress enter to exit...");
clipboard.addFlavorListener(listener);
System.out.print("Press enter to exit...");
new Scanner(System.in).nextLine();
}
}
При исследовании этого вопроса я обнаружил похожие вопросы:
- Почему в Java возникает исключение java.lang.IllegalStateException: невозможно открыть системный буфер обмена
- прослушивать изменения в буфере обмена, проверять владельца?
Возражения
Я предпочитаю не полагаться на сон, поскольку нет способа точно узнать, когда завершится передача контента. Дополнительно:
- Если вы не спите достаточно долго, IllegalStateException все равно будет возникать.
- Продолжительность сна, которая работает на одном компьютере, не гарантирует, что она будет работать на другом компьютере.
- Продолжительность сна с одной передачей контента не гарантированно будет работать для другой передачи (например, копирование изображения 720p вместо копирования). изображение 4K).
- Если вы «соблюдаете осторожность» и используете очень большую продолжительность сна:
- Пользователю, возможно, придется дождаться включения кнопки.
- Пользователь может нажать кнопку, прежде чем она будет отключена (что приведет к возникновению ошибки).
В любом случае я хотел бы знать, есть ли прослушиватель или обратный вызов, который можно зарегистрировать для выполнения после завершения передачи контента в буфер обмена. Существует ли что-нибудь подобное?
Чтобы уточнить, я открыт для возможности написания моей собственной общей/динамически подключаемой библиотеки, если мне нужно использовать встроенную функцию для достижения этой цели.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -clipboard
Мобильная версия