2008-11-05 8 views
3

그래서 사용자가 내 스윙 앱의 아무 곳에서나 스페이스 바를 누를 때마다 이벤트를 트리거하고 싶습니다 (일부 미디어 일시 중지/일시 중지 해제).Java에서 글로벌 키 누르기를 캡처하십시오.

포커스가있을 수있는 컨트롤과 패널이 너무 많기 때문에 전체적으로 키 이벤트를 추가 할 수 없습니다 (총체적으로는 말할 것도 없습니다).

그래서 굉장

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher() 

을 발견, 당신은 세계의 키를 사전 핸들러를 등록 할 수 있습니다. 그러나 중요한 문제가 있습니다 - 공백은 입력 필드, 테이블 셀 등에서 항상 입력되므로 분명히 일시 중지 이벤트가 발생하지 않습니다!

어떤 아이디어가 있습니까? 아마도 편집 가능한 모든 컨트롤 (구토!)의 목록을 확인하지 않고 커서가 텍스트 입력을 허용하는 대상에 초점을 맞추고 있는지를 전체적으로 감지하는 방법이 있을까요?

답변

2

당신이 스스로 대답했다고 생각합니다. 그렇습니다. 포커스가있는 현재 요소를 찾을 수 있다고 생각합니다. 특정 필드 클래스의 인스턴스이면 일시 중지 이벤트를위한 공간을 무시합니다. 솔기가 심한 경우 걱정하지 마세요. instanceof는 JVM에서 매우 빠릅니다 (어떤 이유로 든 프로세서에 대한 인간의 스케일 이벤트를 말하는 경우).

1

내 스윙에 녹슬지 만 Toolkit.addAWTEventListenerKEY_EVENT_MASK을 사용하여 글로벌 수신기를 등록해야한다고 생각합니다. 그런 다음 AWTEvent 처리 유형과 소스를 기준으로 AWTEvent 처리를 필터링 할 수 있습니다.

0

Ok ... 원본을 기준으로 필터링하려고합니다. 문제는 내 편집 가능한 선택 상자 ... 그들은 instanceof를

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField 

입니다입니다 그리고 BorderlessTextField 개인 내부 클래스이기 때문에, 나는 분명히 캔트 반대의 인스턴스 점검을한다.

아이디어가 있으십니까?

편집 : 확인

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() { 

      public boolean postProcessKeyEvent(KeyEvent e) { 
       if (e.getID() == KeyEvent.KEY_PRESSED) { 
        Object s = e.getComponent(); 
        if (!(s instanceof JTextField) && 
         !(s instanceof JTable && ((JTable) s).isEditing()) 
         ) { 
         music_player.pauseEvent(); 
        } 

        //System.out.println(s.getClass().toString()); 
       } 
       return true; 
      } 
     }); 

그것의 완전히 총 ....이 작품 그래서 나는 그것을 싫어. 키 누르기가 구성 요소에 의해 소비되었는지 확인하는 방법을 알아낼 수 있으면 좋겠다. 그런 다음 키 누르기가 모든 구성 요소에서 작동하지 않을 때만 일시 중지 이벤트를 수행 할 수있었습니다.