Java CTRL+;C在我将剪贴板的所有权设置为StringSelection后不复制到剪贴板

Java CTRL+;C在我将剪贴板的所有权设置为StringSelection后不复制到剪贴板,java,clipboard,copy-paste,Java,Clipboard,Copy Paste,我使用StringSelection和clipbaord方法粘贴字符串 StringSelection selection = new StringSelection("myString"); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(selection, selection); 这会将剪贴板的所有权授予所选内容。然后,我使用机器人

我使用StringSelection和clipbaord方法粘贴字符串

StringSelection selection = new StringSelection("myString");

    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents(selection, selection);
这会将剪贴板的所有权授予所选内容。然后,我使用机器人粘贴内容,但后来当我使用机器人尝试复制屏幕上选定的文本时,通过模拟CTRL+C,似乎失败了。然后我将一个字符串设置为剪贴板的内容,得到“mystring”

我认为这可能是由于类clipboard的setContents方法的第二个参数导致的,在该参数中,剪贴板的所有权被赋予了selection。我不知道如何重置剪贴板的所有权。Java文档说lostOwnership方法“将在另一个应用程序或该应用程序中的另一个对象声明剪贴板的所有权时被调用”,所以我不认为这是因为它不会释放所有权


手动使用ctrl+c也无法复制到剪贴板。

首先,我认为在设置剪贴板数据和将数据提供给其他应用程序之间存在延迟。事实上,有一个小的延迟,设置一个线程。在获取内容之前睡眠帮助我。。。但并非所有情况下都如此。从那时起,它就开始随机工作

然后,我编写了一个应用程序来连续执行剪贴板的system.out.println()(正如java程序所显示的那样)。。。但无论我按CTRL+C键多少次,它都只显示旧值(程序启动时的值)。但我确信系统得到了我的CTRL+C,因为java同时表示只有旧数据,windows剪贴板查看器和CTRL+V显示了我刚才复制的数据。因此,似乎只有java无法获得更新

然后,我将代码移动到用户界面线程之外的另一个线程,问题似乎已经停止。我认为有些东西会一直接收剪贴板中的更改,但由于用户界面线程繁忙,即使是睡眠,这些更改也不会被接收

因此,尝试将代码放在从主线程启动的另一个线程中

//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"