KeyEvent没有开火?

时间:2013-03-23 20:18:54

标签: java swing keylistener keyevent

我有一个班级世界如下:

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

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

2 个答案:

答案 0 :(得分:6)

除了不添加KeyListener之外,默认情况下JFrame无法关注,因此不会向窗口发送KeyEvents - KeyEvents本身需要重点才能正常工作。出于这个原因,在Swing中与KeyStrokes进行交互的首选方法是使用Key Bindings,而无需关注组件。

答案 1 :(得分:4)

不,你正在实施界面 - 但从不告诉任何重要的事情。

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

addKeyListener(this);

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