我有一个 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/