具有多个操作的Java密钥绑定

时间:2015-04-09 16:48:58

标签: java macos swing key-bindings

因此,为了参考,我正在关注Trystan's roguelike tutorial for java

上面的教程使用了Key Listeners,它不适用于Mac OS X(并且社区似乎不鼓励),因此我尝试更改代码以使用Key Bindings。

这是问题所在。在他的" roguelike游戏"中,游戏被划分为屏幕,其中每个屏幕具有针对特定键的单独动作。例如,"开始屏幕"将玩家发送到"播放屏幕"按下回车键:

public class StartScreen implements Screen {

    public void displayOutput(AsciiPanel terminal) {
        terminal.write("rl tutorial", 1, 1);
        terminal.writeCenter("-- press [enter] to start --", 22);
    }

    public Screen respondToUserInput(KeyEvent key) {
        return key.getKeyCode() == KeyEvent.VK_ENTER ? new PlayScreen() : this;
    }
}

同时播放屏幕"将玩家发送到" Win屏幕"按下回车键:

public class PlayScreen implements Screen {

    public void displayOutput(AsciiPanel terminal) {
        terminal.write("You are having fun.", 1, 1);
        terminal.writeCenter("-- press [escape] to lose or [enter] to win --", 22);
    }

    public Screen respondToUserInput(KeyEvent key) {
        switch (key.getKeyCode()){
        case KeyEvent.VK_ESCAPE: return new LoseScreen();
        case KeyEvent.VK_ENTER: return new WinScreen();
        }

        return this;
    }
}

现在,从我可以从密钥绑定示例中看到的thisthis,所有绑定和操作似乎都被"转储"成为一个班级。这是不能令人满意的,因为:

  1. 一次击键导致只有一个动作(我想我可以让动作做一个切换案例,并检查我所在的屏幕,然后执行一些特定于所述屏幕的代码,但也许有更好的方法。)
  2. 确定来自哪个屏幕的动作变得更加困难。
  3. 是否有办法让Key Bindings让一个按键执行不同的动作,具体取决于" Screen"?我会使用条件吗?我可以将Key Binding逻辑放在其他类(Screens)中,然后在主类中调用它们,就像上面的Key Listeners一样吗?

1 个答案:

答案 0 :(得分:2)

键绑定不一定要转储到一个类中。它们与输入映射相关联,而输入映射又与特定的JComponent相关联。如果您在表示该屏幕的WHEN_ANCESTOR_OF_FOCUSED_COMPONENT的{​​{1}}输入映射中注册特定于屏幕的绑定,那么当该屏幕中的任何组件具有键盘焦点时,它们将被识别(假设其间的组件没有用自己的方法覆盖绑定),但不是当不同屏幕中的组件具有焦点时。

总的来说,该系统非常灵活。您可以考虑阅读the Java Tutorial section on this topic以加快速度。