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

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

Сообщение Anonymous »

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

Сценарий
Я использую 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();
}

}
Выводы
Внутренне буфер обмена AWT использует функцию OpenClipboard из winuser.h. Согласно документации, «OpenClipboard завершается с ошибкой, если в другом окне открыт буфер обмена». Глядя на базовый код C++ для буфера обмена AWT, мы видим, что это именно причина исключения IllegalStateException.
При исследовании этого вопроса я нашел похожие вопросы:
  • В 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»