因为此方法正在运行两次

时间:2014-01-23 21:09:07

标签: java awt keyboard-shortcuts key-events

我有一种方法,根据点击的按钮执行另一种方法。 只有他似乎在运行两次调用的方法,我不知道为什么。谁能帮助我并向我解释为什么会这样?关注来源

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
        @Override
        public void eventDispatched(final AWTEvent event) {
            final KeyEvent evt = (KeyEvent) event;
            switch (evt.getKeyCode()) {
                case KeyEvent.VK_F1: { 
                    //F1
                    doSomething(); // this method is running twice

                    break;
                }
                case KeyEvent.VK_F2: {
                    //F2
                    doSomething();
                    break;
                }
                }, AWTEvent.KEY_EVENT_MASK);

由于

2 个答案:

答案 0 :(得分:2)

问题似乎是按键和键释放的方法都在触发事件。我建议使用java.awt.event.KeyListener,它具有用于按下和释放事件的单独事件处理程序。

答案 1 :(得分:0)

您正在收到KEY_PRESSED和KEY_RELEASED的活动。

除了具有正确KeyCode的KeyEvent之外,还需要检查是否要确保它是正确的操作,即KEY_PRESSSED。解决此问题的一种方法是在进入switch语句之前添加对操作的检查。

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
    @Override
    public void eventDispatched(final AWTEvent event) {
        if (event.getKeyChar() == KeyEvent.KEY_PRESSED)
        {
            final KeyEvent evt = (KeyEvent) event;
            switch(event.getKeyCode()){
                 //switch statement code
            }
        }   
    }, AWTEvent.KEY_EVENT_MASK);

您可以做的另一件事是创建KeyEventDispatcher并将其添加到KeyboardFocusManager,如下所示:

    //create KeyEventDispatcher myKeyEventDispatcher
    KeyboardFocusManager focusManager = KeyboardFocusManager.
            getCurrentKeyboardFocusManager(); 
    focusManager.addKeyEventDispatcher(myKeyEventDispatcher);

这样你只能获得关键事件,你可以自己发送