为了账号安全,请及时绑定邮箱和手机立即绑定

针对JFrame的无响应的KeyListener

针对JFrame的无响应的KeyListener

心有法竹 2019-07-27 15:15:42
针对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不会收到任何事件。但是,我很确定。我遗漏了什么吗?
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

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

这一过程是相同的:

myComponent.addKeyListener(new KeyListener ...);

注意:有些组件不能像JLabel那样可调焦。

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

myComponent.setFocusable(true);



查看完整回答
反对 回复 2019-07-28
?
手掌心

TA贡献1942条经验 获得超3个赞

如果不想在每个组件上注册侦听器,
你可以添加你自己的KeyEventDispatcherKeyboardFocusManager:

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



查看完整回答
反对 回复 2019-07-28
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

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




查看完整回答
反对 回复 2019-07-28
  • 3 回答
  • 0 关注
  • 546 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号