繁体   English   中英

如何向 JFrame 组件发送 KeyEvent?

[英]How to send an KeyEvent to JFrame Component?

所以我试图向 JFrame 组件发送一个 KeyEvent。 就像当您在 window 正常聚焦时按下一个键时,它会向 JFrame 发送一个 KeyEvent 并触发一些东西。 但是我该如何模拟呢? 如果没有机器人 class,就像直接将 KeyEvent 输入到 JFrame 组件中一样?

我发现了如何将 MouseEvents 发送给它,您可以通过创建 MouseEvent object 并调用 component.dispatchEvent(MouseEvent) 来完成。 然后将鼠标事件发送到 JFrame 并且它运行良好。 但是用 KeyEvents 做同样的事情似乎不起作用。 我已经尝试了几乎所有的事情,比如在 KeyEvent 等之前发送 FocusEvent。 似乎没有任何效果。

这是我试图发送给它的 KeyEvent 对象。 它使用与有效的 MouseEvent 相同的目标和东西。 所以这应该不是问题,问题是发送到组件不起作用。 “key”参数是 KeyEvent.VK_2 之类的密钥 ID

KeyEvent ke = new KeyEvent(target, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, key, (char)key);
KeyEvent ke = new KeyEvent(target, KeyEvent.KEY_RELEASED, System.currentTimeMillis(), 0, key, (char)key);

您是否尝试过按照文档使用 机器人class:

此 class 用于生成本地系统输入事件,用于测试自动化、自运行演示和其他需要控制鼠标和键盘的应用程序

一个例子是:

someComponent.requestFocusInWindow(); // need to focus the component we want the key events to be sent too

try { 
    Robot robot = new Robot(); 
    robot.keyPress(KeyEvent.VK_ENTER); 
} catch (AWTException e) { 
    e.printStackTrace(); 
} 

您可以添加一个 KeyListener,假设这是您想要的。 每个字符都有一个字符代码,这意味着 KeyEvent.VK_2 可以简化为与之等效的代码。 只是为了让它更简单。

public class Foo {
    public static void main(String[] args) {
       JFrame frame = new JFrame();
       frame.setSize(300,300);
       frame.setVisible(true);
       frame.addKeyListener(new KeyListener() {

           @Override
           public void keyPressed(KeyEvent e) {
                if(e.getKeyChar() == 'a'){
                    doSomething();
                }
           }
           @Override
           public void keyTyped(KeyEvent e) {
           }

           @Override
           public void keyReleased(KeyEvent e) {

           }
       });
    }
}

我替换了doSomething(); 使用控制台 output,所以每当我在框架上时,它都会监听我的按键事件,当我按下a时,它会为我执行一些代码。

KeyEvents 实际上是正确发送的。 但是什么都没有发生,因为我只是发送新闻和发布事件,我发现在发送新闻事件后,您需要发送一个类型化的事件,然后是发布事件。 之后,KeyEvents 实际工作。

这是一个例子:

    int key = KeyEvent.VK_2;
    Component target = null;
    
    KeyEvent pressed = new KeyEvent(target, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, key, (char)key, 1);
    KeyEvent typed = new KeyEvent(target, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, 0, (char)key);
    KeyEvent released = new KeyEvent(target, KeyEvent.KEY_RELEASED, System.currentTimeMillis(), 0, key, (char)key, 1);
    
    EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
    queue.postEvent(pressed);
    queue.postEvent(typed);
    queue.postEvent(released);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM