如何将 KeyEvent 发送到 JFrame 组件?

问题描述

所以我试图向 JFrame 组件发送一个 KeyEvent。就像当你在窗口正常聚焦时按下一个键时,它会向 JFrame 发送一个 KeyEvent 并触发一些东西。但是我该如何模拟呢?没有 Robot 类,像直接输入一个 KeyEvent 到 JFrame 组件中一样吗?

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

这是我试图发送给它的 KeyEvent 对象。它使用与有效的 MouseEvent 相同的目标和内容。所以这应该不是问题,问题是将它发送到组件不起作用。 “key”参数是key id,如KeyEvent.VK_2

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

解决方法

您可以添加一个 KeyListener,假设这是您想要的。每个 Character 都有一个 char 代码,这意味着 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();,所以每当我在框架上时,它都会监听我的按键事件,当我按下 a 时,它会为我执行一些代码。

> ,

KeyEvents 实际上是正确发送的。但是什么也没发生,因为我只发送了新闻和发布事件,我发现在发送新闻事件后,您需要发送一个键入的事件,然后是发布事件。之后 KeyEvents 真正起作用了。

举个例子:

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