我正在尝试KeyListener为我的实现JFrame。在构造函数上,我使用以下代码:
KeyListener
JFrame
System.out.println("test"); addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { System.out.println( "tester"); } public void keyReleased(KeyEvent e) { System.out.println("2test2"); } public void keyTyped(KeyEvent e) { System.out.println("3test3"); } });
当我运行它时,该test消息出现在我的控制台中。但是,当我按一个键时,我没有收到其他任何消息,好像该消息KeyListener根本不在那儿。
test
我当时想这可能是因为重点不在上JFrame ,所以他们KeyListener没有收到任何事件。但是,我很确定。
我有什么想念的吗?
你必须将keyListener添加到所需的每个组件中。仅具有焦点的组件将发送这些事件。例如,如果JFrame中只有一个TextBox,则该TextBox具有焦点。因此,你还必须将KeyListener添加到此组件。
过程是一样的:
myComponent.addKeyListener(new KeyListener ...);
注意:某些组件无法像JLabel那样聚焦。
要将它们设置为焦点,你需要:
myComponent.setFocusable(true);
如果你不想在每个组件上注册一个侦听器,则 可以将自己KeyEventDispatcher的侦听器添加到中KeyboardFocusManager:
KeyEventDispatcher
KeyboardFocusManager
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); } }