问题描述
所以我试图向 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);