Можете ли вы определить, когда контент завершил передачу в буфер обмена?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Можете ли вы определить, когда контент завершил передачу в буфер обмена?

Сообщение Anonymous »

TL;DR: я хочу определить, когда контент завершил передачу в системный буфер обмена.

Сценарий
Я использую 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: невозможно открыть системный буфер обмена
  • прослушать изменения в буфере обмена, проверить владельца?
В обоих сценариях решением (пришедшим из потока Coderanch) было использование Thread#sleep(long), чтобы дать время для передачи нового контента в буфер обмена.Возражения
Я предпочитаю не полагаться на спящий режим, поскольку невозможно точно узнать, когда завершится передача контента. Дополнительно:
  • Если вы не спите достаточно долго, исключение IllegalStateException все равно возникнет.
  • Продолжительность сна, которая подходит для одной машины, не гарантирует, что она будет работать на другой машине.
  • Продолжительность сна, при которой одна передача контента не гарантированно будет работать для другой передачи (например, копирование файла 720p). изображение вместо копирования изображения 4K).
  • Если вы «перестраховываетесь», используйте очень длительную продолжительность сна:

    Пользователь возможно, придется подождать, пока кнопка станет активной.
  • Пользователь может нажать кнопку до того, как она будет отключена (что приведет к возникновению ошибки).
Вопрос
В любом случае хотелось бы узнать, есть ли прослушиватель или обратный вызов, который можно зарегистрировать для выполнения после завершения передачи содержимого в буфер обмена. Существует ли что-нибудь подобное?
Чтобы уточнить, я открываю возможность написать свою собственную общую/динамически подключаемую библиотеку, если мне нужно использовать встроенную функцию для достижения этой цели.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -clipboard
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»