【问题标题】:Java ignores VK_Enter event generated by robotJava 忽略机器人生成的 VK_Enter 事件
【发布时间】:2011-10-01 14:13:17
【问题描述】:

我正在使用机器人编写一些集成测试。我让机器人打开一个菜单,它应该从菜单中选择一个选项;除了回车键似乎被忽略了。菜单将打开并选择正确的菜单项,但是如果我按 Enter 键,则没有采取任何应有的操作。如果我手动按下适当的键,它会执行预期的操作。如果我在非 java 应用程序上运行机器人,其他应用程序将正确响应 enter 事件。所以我已经验证了我正确地发送了一个 enter 事件并且 java 菜单应该响应它;但有些东西不起作用。

我也试过用空格事件替换输入事件(菜单也应该响应),也没有得到响应。

我正在使用最新的 sun JDK 在 redhat linux 上运行。我很确定这不是我的代码的明显问题,因为我发现这篇文章描述了遇到完全相同问题的人,但它没有解决方案:http://www.velocityreviews.com/forums/t666100-robot-and-awt-on-linux.html

private void requestTest(String testName){
    if(testName==currentTest)
        return;
    //overwrite config file with new data
    currentTest=testName;
    overwriteFile(configFile, getCurrentConfigFile());

    //close current graph
    pressKeyCombo(KeyEvent.VK_CONTROL, KeyEvent.VK_F4);

    //open File menu
    pressKeyCombo(KeyEvent.VK_ALT, KeyEvent.VK_F);
    //select the 'load defaults' option
    pressKey(KeyEvent.VK_DOWN);
    pressKey(KeyEvent.VK_DOWN);
    pressKey(KeyEvent.VK_DOWN);
    pressKey(KeyEvent.VK_SPACE);
}

【问题讨论】:

  • 可能是平台问题,也可能是代码问题。向您发布说明问题的 SSCCE (sscce.org)。
  • 那不是 SSCCE。请向我解释这是如何编译的?
  • 这就是我所拥有的,我无法在小段代码中重现问题
  • 没错。这就是创建 SSCCE 的意义所在。现在您知道问题出在您的代码中,而不是 JDK 问题。既然您现在基本代码可以工作,那么您就可以弄清楚 SSCCE 和您的真实代码之间的不同之处了。什么时候无法猜测你的真实代码在整个应用的上下文中是什么样子的。

标签: java integration awtrobot


【解决方案1】:

好吧,我遇到了按 Enter 键的同一个问题。我也是,当我最终尝试使用 Enter 操作本机操作系统文件选择器对话框时,没有任何解释,但它不起作用。但似乎可以通过创建另一个调用 Enter 事件的 Robot 对象来解决该问题。因此,请让我至少协助您或其他路过的孤独冲浪者寻求建议。 ;-)

public static void enterKeyIssueTest() {

    // both lines put some content to the Clipboard
    StringSelection ss = new StringSelection("/fancyUser/tightDir/coolFile.apk");
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);

    // 1st Robot Object
    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_CONTROL);   // press Ctrl
    robot.keyPress(KeyEvent.VK_V);         // and press V
    robot.keyRelease(KeyEvent.VK_V);        // release Ctrl
    robot.keyRelease(KeyEvent.VK_CONTROL);  // release V

    // 2nd Robot to my avail
    Robot okRobot = new Robot();

    // presses Enter
    okRobot.keyPress(KeyEvent.VK_ENTER);    // press Enter
    okRobot.keyRelease(KeyEvent.VK_ENTER);  // release Enter
} 

这确实是一个很小的例子,但我希望上面代码中的解释会有所帮助。事实上,第二个 Robot 对象为我做了 Enter 事件。

最好的问候, semo

【讨论】:

    【解决方案2】:

    我猜您的问题是您仅在键为 UP 时触发事件时才使用 VK_DOWN。我的意思是你应该模拟按键输入事件,即 DOWN 然后 UP。试试吧,我希望这会奏效。

    【讨论】:

    • 实际上,我担心这只是我只发布一段代码的问题。按键和按键组合方法按下和释放按钮,以及在击键之间短暂暂停
    【解决方案3】:

    我终于解决了这个问题。我让我的机器人代码与按钮效果一起在事件调度线程中运行。这意味着在我的机器人完成执行之前,没有任何按钮可以响应我的机器人的动作。

    我不完全确定为什么这会阻止我的机器人在这种情况下正常工作。我发现如果我删除了 ctrl-F4 命令,机器人会响应 enter 命令,但似乎两个命令都应该在机器人返回的那一刻排队并正确执行。我假设排队的事件数量有限制,或者我以某种方式结束了两个事件之间的数据竞争。无论哪种方式,通过将我的机器人移动到一个单独的线程中,我都可以获得所需的行为。

    顺便说一句,我无法创建 SSCCE 的原因是因为我试图将机器人合并到一个按钮中,并且我尝试让机器人一次执行多个事件;但我没有尝试使用按钮生成机器人执行多个事件。要重现这个问题,我最终会得到与原始代码一样复杂的代码。

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 1970-01-01
      • 2011-07-05
      • 2011-10-20
      • 2013-11-07
      • 2020-11-29
      • 1970-01-01
      • 2021-12-01
      • 2017-06-18
      相关资源
      最近更新 更多