gpt4 book ai didi

java - 多个 Keylistener Java

转载 作者:行者123 更新时间:2023-11-30 02:34:38 27 4
gpt4 key购买 nike

目前我正在尝试编写一个基于网格的游戏。我已经成功实现了用于一般导航的关键监听器。但是当按下某个键时,会打开一个 Jpopup 菜单。

现在我想通过一个关键监听器来实现菜单导航。按 B 应该会再次关闭菜单。

  KeyListener  UnitActionMenuKeyListener =   new KeyListener()          { 
@Override
public void keyPressed(KeyEvent evt)
{

if (evt.getKeyCode()==KeyEvent.VK_B)

menu.setVisible(false)
}

@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub

JPopupMenu menu = new JPopupMenu("UnitActionMenu");
JMenuItem bewegenItem = menu.add("test");

在此之后使用menu.show和menu.addKeyListener。

但无论我尝试什么,要么我的常规导航不再起作用,要么常规导航可以工作,但我的菜单不会对按 B 使用react

那么,如何为多个元素实现多个关键监听器?我只是希望我的主窗口能够以不同于菜单的方式监听(并使用react)某个按键

(抱歉,写得不好,我的英语不太好,我因为一个简单的任务失败了 4 个多小时而感到沮丧)

最佳答案

Swing 键绑定(bind)通常比键监听器更好。主要听众有与焦点系统相关的问题。这就是你遇到的问题听起来的样子。当弹出窗口处于 Activity 状态时,它会窃取焦点。只有获得焦点的组件才会发出按键事件。

这里有一个按键绑定(bind)教程:https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

API 稍微复杂一些,但它们更强大,您可以直接指定焦点行为。

<小时/>

这是将按键监听器转换为按键绑定(bind)的快速指南。

对于关键监听器,您有一些如下所示的代码:

myComponent.addKeyListener(new KeyListener() {
...
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_Z)
performZAction();
}
});

编写按键绑定(bind)如下所示:

KeyStroke keystroke =
KeyStroke.getKeyStroke("typed Z");
myComponent.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
.put(keystroke, "zAction");
myComponent.getActionMap()
.put("zAction", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
performZAction();
}
});

换句话说,分为三个步骤:

  1. 创建 javax.swing.KeyStroke带有 KeyStroke.getKeyStroke 的对象。
  2. 使用输入映射,将按键绑定(bind)到您的操作的名称。
  3. 使用操作映射,将操作的名称绑定(bind)到 javax.swing.Action

Action 是您的监听器。您可以扩展javax.swing.AbstractAction,就像编写ActionListener一样。

关于java - 多个 Keylistener Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43421831/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com