【问题标题】:KeyListener and KeyBinding issueKeyListener 和 KeyBinding 问题
【发布时间】:2016-12-09 19:10:25
【问题描述】:

我最近做了一个坦克游戏,但我遇到了一个严重的问题。对于键盘输入,我使用了 KeyListener,但在播放过程中,突然,KeyListener 没有响应。钥匙刚刚停止工作。我在互联网上寻找这个问题,我发现很多答案说我应该使用 KeyBinding。我这样做了,但问题又出现了。我该怎么办?

这只是 KeyBinding 的一小段代码。

public Action redTankBackwardReleased = new AbstractAction("action") {
    private static final long serialVersionUID = 1L;
    public void actionPerformed(ActionEvent e) {
        Game.redTank.xSpeed = 0;
        Game.redTank.ySpeed = 0;
    }
};

panel.getInputMap().put(KeyStroke.getKeyStroke("released DOWN"), "8");
panel.getActionMap().put("8", redTankBackwardReleased);

一切正常,但几秒钟或一分钟后,按键停止响应......我不明白。

【问题讨论】:

  • 如果这是一个 Swing GUI,那么键绑定应该工作,如果他们不工作,那么你的代码中一定有一个错误,我们是不知情。如果您在此处或任何站点上需要帮助解决此问题,您将需要发布相关代码。最好不要发布整个程序或小型 sn-ps,而是发布一个非常小的可编译和可运行的程序来演示您的问题,minimal reproducible example
  • 没有代码我们无能为力。我能给出的最佳建议是:一个组件只有在获得焦点时才会收到KeyEvents,所以只需使用FocusListener 来确定它何时失去焦点。除此之外,没有代码我们也无能为力。
  • @Paul:如果他使用 Key Bindings,那么焦点应该不是问题如果他使用了正确的 InputMap,但同样,我们没有他的代码,不知道他使用的是哪个 InputMap。
  • @HovercraftFullOfEels 好吧,这个建议是关于 KeyListener-part 的(应该说清楚)。但最终这整件事如果没有任何代码就毫无意义。
  • 我马上把代码贴在这里。

标签: java swing keylistener


【解决方案1】:

您使用了错误的 InputMap。您应该使用与 int 常量 JComponent.WHEN_IN_FOCUSED_WINDOW 关联的那个。应该是这样的

KeyStroke releasedDown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true);
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = panel.getInputMap(condition);
ActionMap actionMap = panel.getActionMap(); // there's only one ActionMap

// then use as you normally would
inputMap.put(....);
actionMap.put(...);

【讨论】:

  • 如果这不能解决您的问题,那么正如我对您的问题的评论中所述,发布有效的minimal reproducible example - 请查看链接。
  • 我应该在这段代码中的什么地方实现要在按下的键上运行的代码?
  • @Erninger:当然是在进入 ActionMap 的 Action 中。您是否已完成 Key Bindings 教程?如果不是,请这样做,因为那里有很好的解释:Key Bindings
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
相关资源
最近更新 更多