2008-11-05 11 views
3

Так что я хочу вызвать событие (приостановка/приостановка некоторых носителей) всякий раз, когда пользователь нажимает пробел в любом месте моего приложения Swing.захватывает глобальные нажатия клавиш в Java

Поскольку существует так много элементов управления и панелей, которые могут иметь фокус, на самом деле невозможно добавить к ним все ключевые события (не говоря уже о брутто).

Так что я нашел

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher() 

, который является удивительным, вы можете зарегистрировать глобальное нажатие клавиш предустановки-обработчик. Однако есть большая проблема: пробелы будут вводиться все время в поля ввода, ячейки таблицы и т. Д., И я, очевидно, не хочу запускать событие паузы!

Значит, любые идеи? Возможно, есть способ обнаружить глобально, ориентирован ли курсор на что-то, что позволяет вводить текст, без необходимости проверять список всех редактируемых элементов управления (рвота!)?

ответ

2

Я думаю, что вы сами ответили на это - да, я думаю, вы можете узнать текущий элемент, который имеет фокус, и если он является экземпляром определенного класса полей, вы игнорируете пространство с целью приостановки события. Если он сжимает тяжелую руку, не волнуйтесь, instanceof ОЧЕНЬ быстро для JVM (и в любой причине вы говорите о событиях человеческого масштаба, которые являются эоном для процессора).

1

Я ржавый на своем свинге, но я думаю, вам стоит попробовать зарегистрировать глобального слушателя, используя Toolkit.addAWTEventListener с KEY_EVENT_MASK. Затем вы можете фильтровать обработку AWTEvent на основе ее типа и источника.

0

Ok ... Ну, я пытаюсь фильтровать на основе источника. Проблема заключается в мои редактируемые ComboBoxes ... Они InstanceOf

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField 

А поскольку BorderlessTextField частный внутренний класс, я, видимо, не могу сделать проверку InstanceOf против него.

идеи?

EDIT: нормально так это работает ....

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

Его совершенно полная, и я ненавижу его. Мне жаль, что я не смогу найти способ проверить, был ли нажат какой-либо компонент, - тогда я мог бы выполнять только событие паузы, когда на клавиатуре не выполнялся какой-либо компонент.