Прослушивание ключевых событий для иерархии компонентов

У меня есть приложение Swing, которое должно отображать различные наборы элементов управления в зависимости от того, нажаты ли клавиши control или alt. Я добавил KeyListener к основному компоненту, но он уведомляется, только если этот компонент выбран, а не если выбран подкомпонент. Есть ли способ прослушивать события для компонента и всех потомков?

Edit:

Я пробовал использовать InputMap основного компонента, но при нажатии клавиши-модификатора событие не запускается. В частности, у меня есть следующий код:

InputMap inputMap = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inputMap.put(KeyStroke.getKeyStroke("pressed CONTROL"), "test1");
inputMap.put(KeyStroke.getKeyStroke("released CONTROL"), "test2");
ActionMap actionMap = panel.getActionMap();
actionMap.put("test1", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("pressed");
    }
});
actionMap.put("test2", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("released");
    }
});

При нажатии и отпускании клавиши управления будет напечатано " отпущено ", но не" нажато ". Ничто другое не регистрирует что-либо в любой InputMap, поэтому это не значит, что что-то еще зарегистрировано для того же нажатия клавиши.

6
задан Adam Crume 2 February 2011 в 23:49
поделиться