【问题标题】:Simulate key inputs in Java for JUnit Test在 Java 中模拟 JUnit 测试的关键输入
【发布时间】:2013-05-07 22:02:23
【问题描述】:

我想模拟 Enter 按键。我尝试使用机器人类,但它似乎不起作用:

robot = new Robot();
robot.keyPress(KeyEvent.VK_ENTER);
try{Thread.sleep(50);}catch(InterruptedException e){}
robot.keyRelease(KeyEvent.VK_ENTER);

在我的主要代码中,我有

 public void keyPressed(KeyEvent e) {
        if (e.getKeyChar() == KeyEvent.VK_ENTER) {
            System.out.println("ENTER KEY PRESSED");
            // DO SOMETHING;
        }
    }

所以如果 keyPress 被注册,那么控制台应该打印出“ENTER KEY PRESSED”,但它没有这样做。

感谢您的帮助!

另外,如果您知道在没有机器人类的情况下模拟关键事件的方法,请在下面发布:)。

来源:How to simulate keyboard presses in java?

【问题讨论】:

  • 您是否为添加了KeyListener 的元素请求焦点?
  • @BackSlash:谢谢!我忘了这样做:(。
  • 不客气,我也写了一个答案,如果你认为它是最好的,那就接受吧:)
  • 是的,我做到了,它有效:)。

标签: java keypress awtrobot


【解决方案1】:

问题不仅仅在于您如何使用Robot

KeyListener 只会在它附加到的组件是可聚焦且具有焦点时才会响应。

首先,不要使用KeyListener,而是使用key bindings,这将有助于解决焦点问题。

其次,确保您尝试与实际键盘焦点交互的窗口(并且焦点不在将消耗 Enter 键的控件上)

【讨论】:

    【解决方案2】:

    我假设您之前已将KeyListener 添加到您的组件中。如果没有,请使用:

    yourComponent.addKeyListener(yourKeyListener);
    

    如果您已经这样做了,但仍然无法正常工作,可能是您没有为添加了 KeyListener 的组件请求焦点

    尝试在robot.keyPress之前添加这个:

    yourComponent.requestFocus();
    

    其中yourComponent 是应该生成KeyPressed 事件的组件

    【讨论】:

    • 这只会使有问题的组件起作用,实际上是可聚焦的。 Ps 你应该使用 requestFocusInWindow 而不是 requestFocus ;)
    • @MadProgrammer 所有 Component 和 JComponent-extended 类都有一个 requestFocus 方法,所以我认为它应该适用于每种类型的 GUI 组件
    • 我认为你需要阅读docs"请注意,不鼓励使用此方法,因为它的行为取决于平台。相反,我们建议使用 requestFocusInWindow()。如果如果您想了解有关焦点的更多信息,请参阅 Java 教程中的如何使用焦点子系统部分。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多