Java忽略机器人生成的VK_Enter事件

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

我也尝试用空间事件替换enter事件(菜单也应该响应)并且也没有响应。

我正在使用最新的sun JDK在redhat linux上运行。 我很确定这对我的代码来说不是一个明显的问题,因为我发现这篇文章描述了遇到完全相同问题的人,但它没有解决方案: http : //www.velocityreviews.com/forums/t666100-机器人和AWT上-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); } 

好吧,我遇到了按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

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

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

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

顺便说一句,我无法创建SSCCE的原因是因为我试图将机器人合并到一个按钮中,我试图让机器人同时做多个事件; 但我没有尝试按钮产生一个机器人做多个事件。 要重新创建此问题,我最终会得到与原始代码一样复杂的代码。