Сценарий
Я использую FlavorListener для переключения кнопки при изменении типа содержимого буфера обмена. Прослушиватель вызывает Clipboard#getAvailableDataFlavors, который непоследовательно выдает исключение IllegalStateException, когда я копирую данные из других программ, говоря: «Невозможно открыть системный буфер обмена».
< h2>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