多个Keylisteners Java

时间:2017-04-15 03:18:43

标签: java swing keylistener jpopupmenu

目前我正在尝试编写基于网格的游戏。 香港专业教育学院已经设法实现了一般导航的关键监听器。 但是当按某个键时,会打开一个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个小时而感到沮丧)

1 个答案:

答案 0 :(得分: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
  4. Action是你的倾听者。您可以扩展javax.swing.AbstractAction,就像撰写ActionListener一样。