【问题标题】:Java Swing: How can I change a button's text when the Alt key is held?Java Swing:按住 Alt 键时如何更改按钮的文本?
【发布时间】: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


【解决方案1】:

要处理键事件而不管当前哪个元素具有焦点,请使用附加到当前 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 键和事件触发之间似乎确实存在一个小的、不可预测的延迟。也许是因为它是修饰键?我不清楚是否可以消除这种延迟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    相关资源
    最近更新 更多