1

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

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);

谢谢

4

2 回答 2

2

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

于 2014-01-23T21:26:50.713 回答
1

您正在接收 KEY_PRESSED 和 KEY_RELEASED 的事件。

除了KeyEvent拥有正确的 KeyCode 之外,您还需要检查是否要确保它是正确的操作,即 KEY_PRESSED。解决此问题的一种方法是在进入 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);

这样你只会得到关键事件,你可以自己调度它们

于 2014-01-23T21:38:29.947 回答