继续关注Key Listener的Java游戏

时间:2012-11-17 20:03:59

标签: java swing focus jframe

我正在开发Java游戏开发,我遇到的一个问题是实现击键。我已经正确实现了KeyListeners的代码,但是只要我点击游戏窗口或其外部,KeyListener就会停止工作。

我确定这是一个焦点问题,因为我可以最小化窗口并将其重新启动,KeyListener将再次运行。

我的设置是一个JFrame,其中包含用于绘图的Canvas对象。我有一个常规的KeyListener,我将其添加到JFrame。

所以,我猜,当我点击游戏时,Canvas会获得焦点?但它不应该,因为我将isFocasable()设置为false。

以下是我正在使用的一些代码,所以没有任何混淆:

在这里,我创建了屏幕和画布

public final void initScreen(DisplayMode dm, boolean fs, boolean vs)
{
    screen = new EScreen (dm, fs, vs); 
    canvas = new EGameCanvas (screen);
    canvas.setFocusable (false);
    screen.add(canvas);

    keyMapManager = KeyMapManager.getInstance (this);

    if (fs) {
        screen.setFullScreen ();
    }
    else {
        screen.setWindowed ();
    }
}

这是我添加KeyListener的地方(注意KeyMap实现了KeyListener,仅此而已)

public boolean setActiveKeyMap(String newKeyMap)
{
    if (keyMaps.containsKey(newKeyMap)) {
        screen.removeKeyListener (activeKeyMap);
        activeKeyMap = keyMaps.get (newKeyMap);
        screen.addKeyListener (keyMaps.get (newKeyMap));

        return true;
    }
    return false;
}

这是我的keyPressed事件,只是简单地改变了一个变量

public void keyPressed(KeyEvent ev) {
    if (ev.getKeyCode() == KeyEvent.VK_ESCAPE)
        game.setIsRunning (false);
}

请注意,所有这些代码都运行正常。也就是说,直到我点击游戏窗口。我没有在任何地方实现任何MouseListener。另外,我确实实现了这段代码:

screen.setFocusTraversalKeysEnabled (false);

最后,正如您所看到的,我的游戏处理全屏模式和窗口模式。两者都会出现此问题。

1 个答案:

答案 0 :(得分:2)

我对我的游戏有相同的配置: 将keyListener添加到画布而不是JFrame

如果您仍希望JFrame发送事件,您也可以将它添加到JFrame和画布(相同的keyListener)

canvas.addKeyListener(this);

* this:假设您正在实现的对象是KeyListener接口