2014-01-23 5 views
0

У меня есть метод, в котором он выполняет другой метод в зависимости от нажатой кнопки. Только он, кажется, запускает методы, называемые дважды, и я не знаю почему. Может ли кто-нибудь помочь мне и объяснить мне, почему это так? Следит по источникамПоскольку этот метод работает дважды

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

Благодарности

+0

Look ответ на этот пост: http://stackoverflow.com/questions/9864297/onkey-event-dispatched-twice-when-i-type-some-text-into-a-textbox-how-to-preven – mdewitt

+0

@ Это не поможет. Он проверяет правильность нажатия клавиши. –

+0

@Stendika Но он может получить событие от действия вниз и от правильного нажатия клавиши. Оба имеют правильный код ключа. – mdewitt

ответ

0

Вы получаете событие для KEY_PRESSED и KEY_RELEASED.

Вам необходимо убедиться, что в дополнение к KeyEvent с правильным KeyCode вы хотите убедиться, что это правильное действие, то есть 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); 

Таким образом, вы получите только ключевое событие, и вы можете направить их себе

+0

Я понял. Спасибо. – Rafael

+0

Добро пожаловать. Если один из ответов помог вам, вы можете принять его, так что это уже не вопрос без ответа. – mdewitt

2

Проблема, кажется, что и при нажатии клавиш и клавишные выпустили методы инициирования события. Я бы рекомендовал использовать java.awt.event.KeyListener, который имеет отдельные обработчики событий для событий печати и выпуска.

Смежные вопросы