侦听组件层次结构的关键事件

Ada*_*ume 6 java events swing keylistener

我有一个Swing应用程序,需要根据是否按下控制键或alt键来显示不同的控件组.我在主组件中添加了一个KeyListener,但只有在选择了该组件时才会通知它,而不是在选择了子组件时.有没有办法听取组件和所有后代的事件?

编辑:

我尝试使用主要组件的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");
    }
});
Run Code Online (Sandbox Code Playgroud)

按下并释放控制键时,将打印"已释放"但未"按下".没有其他任何东西在任何InputMap中注册任何东西,所以它不像其他东西被注册为相同的键击.

Hov*_*els 2

您可能想尝试使用键绑定而不是 KeyListeners。键绑定是一个更高级别的构造,即使“监听”的组件没有焦点,也可以监听按键——与 KeyListener 不同。您可以在 Swing 教程中找到更多相关信息:如何使用键绑定