【问题标题】:CTRL+C not copying to clipboard after I set ownership of clipboard to StringSelection将剪贴板的所有权设置为 StringSelection 后,CTRL+C 不复制到剪贴板
【发布时间】:2014-09-06 04:24:28
【问题描述】:

我使用 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 也无法复制到剪贴板。

【问题讨论】:

    标签: java clipboard copy-paste


    【解决方案1】:

    首先,我认为在设置剪贴板数据和将数据提供给其他应用程序之间存在延迟。事实上,有一点延迟,在获取内容之前设置一个 Thread.sleep 对我有帮助......但并非在所有情况下。从那时起它就随机工作了。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多