【发布时间】:2022-01-25 20:40:42
【问题描述】:
我正在开发一个 Swing gui。我有一个“保存”按钮,如果在按住 Alt 键时单击它,我希望它删除一个条目而不是保存。检查单击按钮时是否按住 alt 是没有问题的。这不是这个问题的目的。
我希望“保存”按钮的文本在按下 Alt 时更改为“删除”,并在释放 Alt 时恢复为“保存”。
我尝试向我的 JPanel 添加一个 KeyListener,但它似乎没有激活,可能是因为面板本身没有焦点,因为焦点在它的一个孩子身上。
我已尝试通过 JComponent InputMap 和 ActionMap 进行键绑定,但我无法找出仅对应于 Alt 键的 KeyStroke。我不成功的最佳猜测是:
myPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("alt"), "altKey");
myPanel.getActionMap().put("altKey", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent event) {
log.info("alt has been pressed.");
saveButton.setText(event.getModifiers() == KeyEvent.VK_ALT ? "Delete" : "Save");
}
});
当 Alt 键本身被按下/释放时,无论焦点在窗口中的哪个位置,我如何才能执行代码?
【问题讨论】:
-
您收听了错误的事件。
ActionEvent用于在 Swing(或 AWT)组件上执行用户操作时。您需要收听KeyEvent,特别是按 ALT 键。 -
这是一本关于关键事件以及如何聆听它们的好书:docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html
-
@AliasCartellano 我有一个有效的 KeyEventDispatcher 可以正确检测 Alt 是否被按下/释放。 有时在我按下 Alt 和按键事件被调度之间似乎存在延迟。
-
@Martin 用于键绑定,您可能想尝试
KeyStroke.getKeyStroke(KeyEvent.VK_ALT, InputEvent.ALT_DOWN_MASK)
标签: java swing key-bindings