只需像这样更改您的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特别重要.您修改的代码示例中缺少此特定详细信息.