2010-06-28 2 views
0

У меня есть пользовательский компонент подкласса от JPanel с помощью обработчика клавиатуры. Мое основное приложение вставляет это внутри другого JPanel. Теперь я хочу, чтобы родительский JPanel также реагировал на нажатия клавиш, так как есть некоторые действия, которые необходимо предпринять только тогда, когда компонент сфокусирован, но которые применяются к приложению в целом, а не к этому компоненту (например, когда я нажимаю Ctrl- R Я хочу, чтобы отдельное окно состояния обновлялось, но только тогда, когда у моего компонента есть фокус клавиатуры.)Цепные манипуляторы клавиатуры в Swing

Прямо сейчас я делаю это, явно передавая свой конструктор обработчику, который вызывает его KeyListener, когда это делается, но это вероятно, будет более чистым, чтобы использовать собственный способ качания делать вещи, если он есть. Есть ли поддержка для такого типа обработчиков, соединяющих иерархию контейнеров? Я посмотрел на KeyboardFocusManager и KeyEventHandler, но они кажутся глобальными по объему, тогда как я хочу, чтобы что-то было ограничено одним контейнером, который запускается только тогда, когда один из его детей имеет фокус клавиатуры.

ответ

1

Можно также попытаться добавить ключевое связующее компоненту.

Here's a tutorial, который покажет вам, как использовать привязки клавиш. Связывание клавиш позволяет вам назначать конкретные действия компонентов для выполнения, когда они имеют определенный фокус, и может использоваться на любом объекте, который расширяет JComponent. Это можно использовать более широко среди всех JComponent и поддерживает различные типы фокуса, например. когда компонент имеет только фокус или когда его окно имеет фокус. Добавление и удаление прослушивателя клавиш может привести к появлению небольших ошибок в вашем приложении, особенно если прослушиватель фокуса пропущен, поэтому будьте осторожны, если вы выберете этот маршрут.

+0

спасибо, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT выглядит точно, что мне нужно –

0

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

пример:

FocusListener focusListener = new FocusListener() { 
    public void focusGained(FocusEvent event) { 
     event.getComponent().addKeyListener(keyListener); 
    } 

    public void focusLost(FocusEvent event) { 
     event.getComponent().removeKeyListener(keyListener); 
    } 

}; 
1

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

Если вы хотите предотвратить распространение определенного события, когда конкретный компонент имеет фокус, вызов consume() в событии предотвратит его обработку после завершения обработчика события.

пример:

KeyListener listener = new KeyAdapter() { 
    public void keyPressed(KeyEvent event) { 
     //...do some processing... 
     event.consume(); 
    } 
}; 
+0

Я пробовал это, и он не работает: http://pastebin.org/366275 запускается только клавиша-ключ лейбла. –

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