在尝试为 JFrame 实现 KeyListener 时,开发人员遇到了一个令人费解的问题:KeyListener 似乎没有响应,按下按键时控制台中不会出现任何消息。开发者怀疑JFrame缺乏焦点,寻求帮助。
经过仔细检查,发现KeyListener确实添加正确,并且焦点设置得当。然而,缺少一个关键元素:将按键事件传播到 KeyListener 的机制。
解决方案在于使用 KeyEventDispatcher。该调度程序可以定义为 JFrame 中的内部类并添加到 KeyboardFocusManager。调度程序的dispatchKeyEvent 方法处理所有按键事件,包括keyPressed、keyReleased 和keyTyped。通过实现这种机制,KeyListener 可以有效地捕获并响应按键事件。
下面是一个修改后的代码示例,其中包含了 KeyEventDispatcher:
public class MyFrame extends JFrame { private class MyDispatcher implements KeyEventDispatcher { @Override public boolean dispatchKeyEvent(KeyEvent e) { if (e.getID() == KeyEvent.KEY_PRESSED) { System.out.println("tester"); } else if (e.getID() == KeyEvent.KEY_RELEASED) { System.out.println("2test2"); } else if (e.getID() == KeyEvent.KEY_TYPED) { System.out.println("3test3"); } return false; } } public MyFrame() { add(new JTextField()); System.out.println("test"); KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); manager.addKeyEventDispatcher(new MyDispatcher()); } public static void main(String[] args) { MyFrame f = new MyFrame(); f.pack(); f.setVisible(true); } }
通过此修改,KeyListener 现在将成功接收并处理关键事件,在控制台中提供预期的输出。
以上是为什么我的 JFrame 的 KeyListener 不响应按键?的详细内容。更多信息请关注PHP中文网其他相关文章!