Java Swing:如何在按住 Alt 键时更改按钮的文本?

Java Swing: How can I change a button's text when the Alt key is held?

我有一个正在使用的 Swing gui。我有一个“保存”按钮,如果在按住 Alt 键时单击它,我希望它删除一个条目而不是保存。检查单击按钮时是否按住 alt 是没有问题的。这不是这个问题的目的。

我希望在按下 Alt 时“保存”按钮的文本更改为“删除”,并在按下 Alt[时返回“保存” =27=] 已发布。

我已经尝试将 KeyListener 添加到我的 JPanel,但它似乎没有激活,可能是因为面板本身没有焦点,因为焦点在它的一个子项上。

我已经尝试通过 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 键本身是 pressed/released 时,无论焦点在 window 中的什么位置,我如何才能执行代码?

要处理键事件而不管哪个元素当前具有焦点,请使用附加到当前 KeyboardFocusManager 的 KeyEventDispatcher,例如:

KeyboardFocusManager.getCurrentKeyboardFocusManager()
    .addKeyEventDispatcher((KeyEvent event) -> {
        if (event.isAltDown()) {
            saveButton.setText("Delete");
        } else {
            saveButton.setText("Save");
        }
        return false; // `false` allows further handling by other code
    });

感谢@AliasCartellano

注意:在您按下 Alt 键和事件触发之间似乎确实存在一个小的、不可预测的延迟。也许是因为它是修饰键?我不清楚是否可以消除这种延迟。