在循环中无法处理KeyBindings?

时间:2015-01-05 22:22:34

标签: java swing key-bindings

我正在尝试制作Snake游戏,即普通的老式游戏,但我在使用键绑定方面遇到了一些困难。

我创建了我的Gui类的实例,它生成了JFrame,JPanel和JPanel数组。在这个实例之后,我喜欢使用while循环来检查玩家是否还活着,如果玩家是,则蛇每隔约1/4秒移动一个正方形,具体取决于难度。

当不在while循环中时,我可以正确使用键绑定,但当我让我的程序进入循环时,它无法识别我使用我的按钮。

也许这是Java中的标准事物,我不知道。如果是的话,有人可以告诉我应该如何处理我的问题吗?

InputMap im = base.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap am = base.getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "Right");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "Up");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "Down");

am.put("Right", new ArrowAction("Right"));
am.put("Left", new ArrowAction("Left"));
am.put("Up", new ArrowAction("Up"));
am.put("Down", new ArrowAction("Down"));

上课:

public class ArrowAction extends AbstractAction {
    String txt;

    public ArrowAction(String txt) {
        this.txt = txt;
    }

    public void actionPerformed(ActionEvent e) {
        if (txt.equalsIgnoreCase("Left")) {
            System.out.println("The left arrow was pressed!");
            keyPressed = 0;
        } else if (txt.equalsIgnoreCase("Right")) {
            System.out.println("The right arrow was pressed!");
            keyPressed = 1;
        } else if (txt.equalsIgnoreCase("Up")) {
            System.out.println("The up arrow was pressed!");
            keyPressed = 2;
        } else if (txt.equalsIgnoreCase("Down")) {
            keyPressed = 3;
            System.out.println("The down arrow was pressed!");
        }
    }
}

只是一个普通的while循环:

while (alive == true) {
   // Some stuff happening, not relevant
}

那么为什么我的键绑定在循环中不起作用,但是在它之外工作呢?

1 个答案:

答案 0 :(得分:0)

你的问题出在'一般的循环'中。这不是GUI应用程序的工作方式。在所有GUI应用程序(包括Java Swing)中,框架运行循环并向您发送要响应的事件。你写的一切都需要回应一个事件。如果它是一个应该一直运行的后台任务,那么它需要在自己的线程上 - 但我怀疑你的游戏需要它。

因此,删除你的一般while循环,并在自己的线程中或者(更有可能)定期发生'some stuff'以响应计时器。