一尘不染

JavaJFrame的KeyListener无响应

java

我正在尝试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根本不在那儿。

我当时想这可能是因为重点不在上JFrame
,所以他们KeyListener没有收到任何事件。但是,我很确定。

我有什么想念的吗?


阅读 678

收藏
2020-03-05

共2个答案

一尘不染

你必须将keyListener添加到所需的每个组件中。仅具有焦点的组件将发送这些事件。例如,如果JFrame中只有一个TextBox,则该TextBox具有焦点。因此,你还必须将KeyListener添加到此组件。

过程是一样的:

myComponent.addKeyListener(new KeyListener ...);

注意:某些组件无法像JLabel那样聚焦。

要将它们设置为焦点,你需要:

myComponent.setFocusable(true);
2020-03-05
一尘不染

如果你不想在每个组件上注册一个侦听器,则
可以将自己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);
    }
}
2020-03-05