JFrame 的无响应 KeyListener

2022-08-31 12:18:16

我正在尝试为我的 .在构造函数上,我使用以下代码:KeyListenerJFrame

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"); }
});

当我运行它时,消息会出现在我的控制台中。但是,当我按一个键时,我没有得到任何其他消息,就好像那里甚至不存在一样。testKeyListener

我在想,这可能是因为重点不在于
,所以他们没有收到任何事件。但是,我很确定它是。JFrameKeyListener

我错过了什么吗?


答案 1

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

答案 2

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

过程是相同的:

myComponent.addKeyListener(new KeyListener ...);

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

要将它们设置为可聚焦,您需要:

myComponent.setFocusable(true);

推荐