KeyListener仅在单击画布后才处于活动状态

时间:2014-03-28 22:31:48

标签: java swing canvas focus keylistener

我有一个实现KeyListener的类,一切正常,但是我的KeyListener只有在点击Canvas后才有效,所以如果我开始游戏,我必须单击它然后我可以使用我的键盘,代码:

public class Game extends Canvas implements Runnable {
    ....
    initGame() {
        ...
        addKeyListener(new Keyboard());
        setFocusable(true);
    }

    private class Keyboard implements KeyListener {
        ...
    }
}

- 是否有一种方法可以在创建后使画布“活动”?

3 个答案:

答案 0 :(得分:1)

KeyListener只会在注册的组件具有焦点并且具有焦点时才会响应关键事件。

虽然您可以使用requestFocusInWindow,但无法保证将焦点转移到组件,如果焦点由于某种原因(您单击其他组件)而丢失,则返回原点。

更好的解决方案是使用基于JComoponet的组件(如JPanel)并使用Key Bindings API,它允许您定义触发关键事件的焦点级别< / p>

答案 1 :(得分:0)

如果在Canvas可见后添加JFrame,则可能会出现问题。

致电

frame.setVisible(true)
最后在添加了所有组件后

如果我在Canvas显示后添加JFrame,我就会发生这种情况,我必须点击Canvas才能获得关注。


- 编辑 -

了解它的示例代码(在取消评论最后frame.setVisible(true)后尝试)

import java.awt.Canvas;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class CanvasDemo extends Canvas implements ActionListener, KeyListener {

    public CanvasDemo() {
        addKeyListener(this);
        setFocusable(true);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setVisible(true);

        CanvasDemo apple = new CanvasDemo();            
        frame.add(apple);

        frame.setTitle("The Game");
        // frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    @Override
    // animates rectangle
    public void actionPerformed(ActionEvent arg0) {
        System.out.println("action performed");
    }

    @Override
    public void keyPressed(KeyEvent arg0) {
        System.out.println("key pressed");
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        System.out.println("key released");
    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        System.out.println("key typed");
    }
}

答案 2 :(得分:0)

我在下一个方面解决了这个问题:我创建了Canvas对象,为它添加了KeyListener并使这个对象可以聚焦。在这些操作之后,我将Canvas对象添加到JFrame,一切都开始正常工作。