문제

따라서 사용자가 내 스윙 앱의 어느 곳에서나 우주 바를 누를 때마다 이벤트 (일부 미디어를 일시 중지/일부 미디어를 사용하지 않음)를 트리거하고 싶습니다.

초점을 맞출 수있는 많은 컨트롤과 패널이 있기 때문에 실제로 모든 사람들에게 키 이벤트를 추가하는 것은 불가능합니다 (총은 말할 것도 없습니다).

그래서 나는 찾았다

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()

굉장합니다. Global Keypress 프리 핸들러를 등록 할 수 있습니다. 그러나 주요 문제가 있습니다. - 공간은 입력 필드, 테이블 셀 등에 항상 입력 될 것이며, 나는 분명히 일시 정지 이벤트를 트리거하고 싶지 않습니다!

그래서 어떤 아이디어가 있습니까? 아마도 모든 편집 가능한 컨트롤 목록을 확인하지 않고도 커서가 텍스트 입력을 허용하는 것에 초점을 맞추고 있는지 전 세계적으로 감지 할 수있는 방법이 있을까요?

도움이 되었습니까?

해결책

나는 당신이 자신에게 대답했다고 생각합니다 - 예, 초점이있는 현재 요소를 찾을 수 있다고 생각합니다. 특정 필드 클래스의 사례 인 경우 일시 정지 이벤트의 목적을위한 공간을 무시합니다. 걱정하지 마십시오. 걱정하지 마십시오. 인스턴스는 JVM에 매우 빠릅니다 (그리고 어떤 원인에서나 프로세서에 대한 EON 인간 규모의 사건에 대해 이야기하고 있습니다).

다른 팁

나는 내 스윙에서 녹슬었지만, 당신은 사용하는 글로벌 리스너를 등록해야한다고 생각합니다. 툴킷 .addawteventListener a KEY_EVENT_MASK. 그런 다음 유형 및 소스에 따라 Awtevent 프로세싱을 필터링 할 수 있습니다.

좋아 ... 글쎄, 나는 소스를 기반으로 필터를 걸려고한다. 문제는 내 편집 가능한 콤보해스입니다 ... 그들은 인스턴스입니다

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

그것은 완전히 거칠고 나는 그것을 싫어한다. Keypress가 어떤 구성 요소에 의해 소비되었는지 확인하는 방법을 알아낼 수 있기를 바랍니다. 그런 다음 Keypress가 구성 요소에 의해 조치되지 않았을 때만 일시 정지 이벤트 만 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top