【问题标题】:KeyEvent not firing?KeyEvent 没有触发?
【发布时间】:2013-03-13 13:33:24
【问题描述】:

我有一个类 World 如下:

public class World extends JFrame implements KeyListener {
    public boolean left = false, right = false, back = false, fwd = false;

    public World() {
        this.setSize(600, 600);
        this.setVisible(true);
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getExtendedKeyCode() == KeyEvent.VK_LEFT) left = true;
        if(e.getExtendedKeyCode() == KeyEvent.VK_RIGHT) right = true;
        if(e.getExtendedKeyCode() == KeyEvent.VK_UP) fwd= true;
        if(e.getExtendedKeyCode() == KeyEvent.VK_DOWN) back = true;
        System.out.println("L:"+left+" R:"+right+" F:"+fwd+" B:"+back);
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getExtendedKeyCode() == KeyEvent.VK_LEFT) left = false;
        if(e.getExtendedKeyCode() == KeyEvent.VK_RIGHT) right = false;
        if(e.getExtendedKeyCode() == KeyEvent.VK_UP) fwd= false;
        if(e.getExtendedKeyCode() == KeyEvent.VK_DOWN) back = false;
        System.out.println("L:"+left+" R:"+right+" F:"+fwd+" B:"+back);
    }

    @Override
    public void keyTyped(KeyEvent e) {}
}

理论上,这应该在按键或按键释放时触发,但它不会。框架中的组件绘制正确。

帧被实例化如下:

World m = new World();
m.getContentPane().setBackground(Color.BLACK);

我似乎无法触发关键侦听器。没有系统输出。有什么想法吗?

【问题讨论】:

  • 我强烈建议不要将关键侦听器附加到 JFrame,这是 KeyListener 的所有正常缺点的一部分(必须集中,必须有焦点),用户之间存在 JRootPane 和内容和框架,这意味着关键侦听器可能无效

标签: java swing keylistener keyevent


【解决方案1】:

不,您正在实现接口 - 但从不告诉任何重要的事情。

你可以在你的构造函数中这样写:

addKeyListener(this);

...我相信那会做正确的事。 Something 基本上必须添加 keylistener。仅仅实现接口并不会自动让任何东西开始使用该实现。

【讨论】:

    【解决方案2】:

    除了不添加KeyListenerJFrame 默认情况下是不可聚焦的,因此不会将KeyEvents 发送到窗口-KeyEvents 本身需要焦点才能工作。出于这个原因,在 Swing 中与KeyStrokes 交互的首选方式是使用Key Bindings,它可以在没有组件焦点的情况下工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      相关资源
      最近更新 更多