我正在尝试为我的JFrame
实现一个KeyListener
。在构造函数中,我使用了以下代码:
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
不会收到任何事件。但是,我很确定是这样的。
我是不是漏掉了什么?
发布于 2008-11-13 13:01:29
您必须将keyListener添加到所需的每个组件中。只有具有焦点的组件才会发送这些事件。例如,如果您的JFrame中只有一个TextBox,则该TextBox具有焦点。因此您还必须向该组件添加一个KeyListener。
过程是相同的:
myComponent.addKeyListener(new KeyListener ...);
注意:有些组件不是可聚焦的,比如JLabel。
要将它们设置为可聚焦,您需要:
myComponent.setFocusable(true);
发布于 2013-02-23 08:29:08
InputMaps和ActionMaps旨在捕获组件、组件及其所有子组件或整个窗口的关键事件。这是通过JComponent.getInputMap()中的参数控制的。有关文档,请参阅How to Use Key Bindings。
这种设计的美妙之处在于,用户可以选择要监视的重要键击,并根据这些键击触发不同的操作。
当在窗口中的任意位置按下退出键时,此代码将对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);
发布于 2009-04-27 15:30:44
我也遇到了同样的问题,直到我读到真正的问题是关于焦点,你的JFrame已经添加了侦听器,但巡视框架从来不是焦点,因为你的JFrame中有很多组件也是可聚焦的,所以试一下:
JFrame.setFocusable(true);
祝好运
https://stackoverflow.com/questions/286727
复制相似问题