【问题标题】:Multiple Keylisteners Java多个按键侦听器 Java
【发布时间】:2017-04-15 03:18:42
【问题描述】:

目前我正在尝试编写基于网格的游戏。 我已经设法为一般导航实现了一个关键监听器。 但是当按下某个键时,会打开一个 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 做出反应

那么,我如何为多个元素实现多个键侦听器? 我只是希望我的主窗口能够以不同于菜单的方式聆听(并做出反应)

(对不起,写得不好,我的英语不是很好,我因为一个简单的任务失败超过 4 小时而感到沮丧)

【问题讨论】:

    标签: java swing keylistener jpopupmenu


    【解决方案1】:

    Swing 键绑定通常比键侦听器更好。关键听众有与焦点系统相关的问题。这就是你遇到的问题听起来像。当弹出窗口处于活动状态时,它会窃取焦点。只有获得焦点的组件才会发出关键事件。

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

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


    这是将键侦听器转换为键绑定的快速指南。

    对于一个关键的监听器,你有一些像这样的代码:

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

    编写一个键绑定应该是这样的:

    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. 使用KeyStroke.getKeyStroke 创建一个javax.swing.KeyStroke 对象。
    2. 使用输入映射,将击键绑定到您的操作名称。
    3. 使用动作映射,将动作名称绑定到javax.swing.Action

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

    【讨论】:

    • 遗憾的是我不明白键绑定是如何工作的。给出的例子非常复杂。我要使用的菜单处于焦点,并且预定义的键绑定(如使用箭头键导航)正在工作。我自己的键绑定/侦听器(与 B 一起退出)不起作用
    猜你喜欢
    • 2012-06-18
    • 2013-11-18
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多