java - 监听组件层次结构的关键事件

标签 java events swing keylistener

我有一个 Swing 应用程序,它需要根据按下的是 control 键还是 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");
    }
});

当按下并释放控制键时,这将打印“released”而不是“pressed”。没有其他东西在任何 InputMap 中注册任何东西,所以它不像是为相同的击键注册了其他东西。

最佳答案

只需像这样更改您的 getKeyStroke(...) 调用:

InputMap inputMap = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, KeyEvent.CTRL_DOWN_MASK, false), "test1");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, 0, true), "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");
    }
});

我试了很多次才想出正确的咒语。

重要的是使用 getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT),以便能够收听子组件和更深层的小部件。

在查找控制键 PRESS 事件时,除了 KeyEvent.VK_CONTROL 之外,指定 KeyEvent.CTRL_DOWN_MASK 尤为重要。您修改后的代码示例中缺少此特定细节。

关于java - 监听组件层次结构的关键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4880704/

相关文章:

java - CodingBat Java 递归 轻微概念错误

java,两个对象,object1 = object2 = class/type ...没看懂

java - 摆脱 JMenu 中浪费/未使用的空间

java - 使用等宽字体时 Substance UI 的 HighlightPainter 问题

java - 如何使用designgridlayout在页面中的两类数据之间插入垂直JSeperator?

java - 按钮在按住时更改可绘制

java - eclipse 3.8 : Call Hierarchy misses callers from jars

c# - 转发/中继 .NET 事件

java - 如何转换SWT事件?为什么 SWT notifyListeners 方法需要事件类型参数?

javascript - 如何在没有 jQuery 的情况下将播放事件绑定(bind)到 AJAX 加载的视频?