У меня есть приложение Swing, которое должно отображать различные наборы элементов управления в зависимости от того, нажата ли клавиша управления или клавиши 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, так что это не так, как будто что-то еще зарегистрировано для того же нажатия клавиши.