猿问

针对JFrame的无响应的KeyListener

针对JFrame的无响应的KeyListener

我正在尝试实现一个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不会收到任何事件。但是,我很确定。

我遗漏了什么吗?


斯蒂芬大帝
浏览 411回答 3
3回答

慕妹3146593

必须将keyListener添加到所需的每个组件中。只有具有焦点的组件才会发送这些事件。例如,如果JFrame中只有一个文本框,则该文本框具有焦点。因此,您还必须向该组件添加一个KeyListener。这一过程是相同的:myComponent.addKeyListener(new KeyListener ...);注意:有些组件不能像JLabel那样可调焦。要将它们设置为可聚焦,您需要:myComponent.setFocusable(true);

收到一只叮咚

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

慕村9548890

InputMaps和ActionMaps用于捕获组件、它及其所有子组件或整个窗口的关键事件。这是通过JComponent.getInputMap()中的参数来控制的。看见如何使用键绑定索取文件。这种设计的美妙之处在于,人们可以选择哪些关键笔画对监控很重要,并根据这些关键笔画触发不同的动作。当在窗口的任何地方命中转义键时,此代码将调用JFrame上的Dispose()。JFrame不是从JComponent派生的,所以您必须使用JFrame中的另一个组件来创建键绑定。内容窗格可能是这样的组件。InputMap inputMap; ActionMap actionMap;AbstractAction action;JComponent component; inputMap  = component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);actionMap = component.getActionMap(); action    = new AbstractAction(){    @Override    public void actionPerformed(ActionEvent e)    {       dispose();    }};inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "dispose");actionMap.put("dispose", action);
随时随地看视频慕课网APP

相关分类

Java
我要回答