2014-11-10 2 views
1

Swing 응용 프로그램에서 일부 전역 키 바인딩을 설정해야합니다. 나는 이런 식으로, 이것에 대한 KeyEvent를 Dispatcher를 사용KeyEventDispatcher가 Java에서 두 번 호출되었습니다.

public class MyKeyEventDispatcher implements KeyEventDispatcher 
{ 

    @Override 
    public boolean dispatchKeyEvent(KeyEvent e) 
    { 
     if (!e.isConsumed()) 
     { 
      if (e.getKeyCode() == KeyEvent.VK_F8) 
      { 
       System.out.println("F8"); 
       e.consume(); 
       return true; 
      } 
     } 
     return false; 
    } 
} 

내 문제는 내가를 keyDown에 대해 한 번의 keyup에 대해 한 번의 F8을 눌러 때이 두 번 호출 될 것입니다. 키 입력 또는 keydown 이벤트인지 어떻게 알 수 있습니까?

내가 대답을 찾은 것 : dispatchKeyEvent() invoking twice,하지만 불행히도, 안드로이드에서만 작동합니다.

+0

이렇게하려면 대신 KeyListener// KeyAdapter를 사용 하시겠습니까? 이 인터페이스는 키 - 다운과 키 - 업을위한 하나의 메소드를 정의합니다 (키 - 눌려진 모든 표시 가능한 문자에 대한 aditionaly) – msrd0

+2

실제로는 KEY_PRESSED, KEY_TYPED 및 KEY_RELEASED의 세 가지를 가져와야합니다. e.getID() == KeyEvent.KEY_PRESSED를 사용하여 이벤트 유형을 확인할 수 있습니다. (생각해 보니 F8은 특별한 키이므로 KEY_TYPED를 얻지 못할 것입니다.) – biziclop

+0

또 다른 가치있는 것은'getModifiers()'메소드입니다. Alt + F8, Ctrl + Shift + F8 등이 있습니다. – biziclop

답변

1

답변은 @biziclop의 주석에 있습니다 : 키 이벤트를 감지하기 위해 e.getID()를 사용하십시오. 또한 Shift + F8, Ctrl + F8 등에서 트리거하는 것을 피하기 위해 수정자를 확인해야한다고 언급했습니다.

(e.getKeyCode() == KeyEvent.VK_F8 && e.getID() == KeyEvent.KEY_PRESSED && e.getModifiers() == 0) 
관련 문제