按键作为按键类型

时间:2015-02-15 21:25:27

标签: java swing keyboard

当我尝试实现KeyEventDispatcher时遇到了一个小问题。按住键盘上的任意键将导致QuestGUI在true和false之间切换。这意味着它会检查每次执行时是否按下了键。我想要的是当我按'A'时它会触发我的KeyEventDispatcher处理的事件。然后它应该等待,直到按下下一个键。我的代码如下所示。

Test.java

package core;

import java.awt.KeyboardFocusManager;
import javax.swing.JFrame;

public class Test
{
    public Test (){
        JFrame frame = new JFrame ();        
        frame.setResizable (false);
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo (null);
        frame.pack ();
        frame.setSize (800, 600);        
        frame.setVisible (true);

        KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        manager.addKeyEventDispatcher(new KeyManager());
    }

    public static void main (String[] args){
        new Test();
    }
}

KeyManager.java

package core;

import java.awt.KeyEventDispatcher;
import java.awt.event.KeyEvent;

public class KeyManager implements KeyEventDispatcher {

    private boolean QuestGUI;

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED) {
            QuestGUI = !QuestGUI;
            System.out.println("QuestGUI" + QuestGUI);
        }
        return false;
    }
}

可以通过添加boolean来检查Q是否被按下来解决,它只会在Q释放后才能解决。像PRESSED_Q一样。然后我需要为每个keybind和匹配它。然而,这感觉很笨拙。我预计KEY_PRESSED会自动执行此操作。

1 个答案:

答案 0 :(得分:2)

就个人而言,我更喜欢使用键绑定来做这种事情,这只是我,但你可以创建两个Action,一个用于按下,一个用于释放,它只需要一个& #34;键"可以根据触发器将Map某种值(即"Up")设置为true / false的值,但这就是我...

核心问题是,KEY_PRESSED事件将根据操作系统定期重复。这意味着您的QuestGUI值不断被翻转。您需要检测KEY_PRESSEDKEY_RELEASED事件并采取适当的措施,例如......

public class KeyManager implements KeyEventDispatcher {

    private boolean QuestGUI;

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED && !QuestGUI) {
            QuestGUI = true;
            System.out.println("QuestGUI" + QuestGUI);
        } else if (e.getID() == KeyEvent.KEY_RELEASED && QuestGUI) {
            QuestGUI = false;
            System.out.println("QuestGUI" + QuestGUI);
        }
        return false;
    }
}

您还可以使用KeyEvent#getKeyCode值,将其放在ListMap中以检测何时按下/释放某些键...

就个人而言,我认为密钥绑定更容易管理,扩展和配置,但我想这一切都归结为上下文。