CTRL + C не копирует в буфер обмена после того, как я установил для владельца буфера обмена значение StringSelection

1

Я использую методы StringSelection и clipbaord для вставки строки.

StringSelection selection = new StringSelection("myString");

    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents(selection, selection);

Это дает право на выбор буфера обмена. Затем я использую робот для вставки содержимого, которое работает, но позже, когда я использую робот, чтобы попытаться скопировать выделенный текст на моем экране, имитируя CTRL + C, он, похоже, терпит неудачу. Затем я устанавливаю строку в содержимое буфера обмена, и я получаю "mystring".

//Control+c
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyType(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);

robot.delay(3000);

//save clipboard into string
String newString = "";
    try {
      newString = (String) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
    } catch (HeadlessException e) {
      e.printStackTrace();
    } catch (UnsupportedFlavorException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } 

System.err.println(newString);//prints "myString"

Я думаю, что это может быть вызвано вторым аргументом метода setContents для буфера обмена классов, в котором было предоставлено право собственности на буфер обмена на выбор. Я не знаю, как восстановить владельца буфера обмена. Java-документы говорят, что метод lostOwnership "будет вызван, когда другое приложение или другой объект в этом приложении утвердит право собственности на буфер обмена". Поэтому я не думаю, что это связано с тем, что он не освободит владельца.

Вручную использовать ctrl + c также не удается скопировать в буфер обмена.

Теги:
copy-paste
clipboard

1 ответ

1

Во-первых, я думал, что существует задержка между настройкой данных буфера обмена и наличием данных для других приложений. На самом деле, существует небольшая задержка, и установка Thread.sleep до получения содержимого помогла мне... но не во всех случаях. С тех пор он работал беспорядочно.

Затем я закодировал приложение, чтобы делать system.out.println() в буфере обмена (как показано программой java) непрерывно... но независимо от того, сколько раз я делал CTRL + C, он показывает только старое значение ( один, когда программа была запущена). Но я уверен, что система получила мой CTRL + C, потому что в то же время java говорит, что есть только старые данные, просмотрщик буфера обмена Windows, а CTRL + V - данные, которые я только что скопировал. Таким образом, кажется, что только java не может получить обновление.

Затем я переместил код в другой поток за пределами потока пользовательского интерфейса, и проблема, похоже, остановилась. Я думаю, что есть что-то, что продолжает получать изменения в буфере обмена, но когда поток пользовательского интерфейса занят, даже со сном, эти изменения не принимаются.

Итак, попробуйте поместить ваш код в другой поток, который запускается из основного потока.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню