【问题标题】:Keep focus on Java game for Key Listener专注于 Key Listener 的 Java 游戏
【发布时间】:2012-11-06 05:23:14
【问题描述】:

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

我确定这是一个焦点问题,因为我可以最小化窗口并将其重新打开,并且 KeyListener 将再次工作。

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

所以,我猜,当我点击游戏时,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);
}

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

screen.setFocusTraversalKeysEnabled (false);

最后,如您所见,我的游戏同时处理全屏模式和窗口模式。两者都会出现这个问题。

【问题讨论】:

  • 正确的解决方案是使用避免这些焦点问题的 KeyBindings。见keybindings tutorial
  • 我知道 KeyBindings 是建议的解决方案。但是,出于好奇,有没有办法处理 KeyListeners 的聚焦问题?
  • @Troncoso isn't there a way to handle focus issues with KeyListeners yes 当你看到焦点改变时调用requestFocusInWindow();,即覆盖JFrame#windowDeiconfied(..)并请求焦点你的JPanel。但是键绑定是解决方案。 +1 罗宾

标签: java swing focus jframe


【解决方案1】:

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

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

canvas.addKeyListener(this);

*this: 假设你的对象实现了 KeyListener 接口

【讨论】:

  • 这是我忘记做的。非常感谢。
猜你喜欢
  • 2014-11-29
  • 2014-07-04
  • 1970-01-01
  • 2021-06-25
  • 2015-06-12
  • 2014-07-21
  • 2010-12-10
  • 2014-01-21
  • 1970-01-01
相关资源
最近更新 更多