Java 将全局密钥侦听器附加到多个按钮

Java 将全局密钥侦听器附加到多个按钮,java,javafx,global,keylistener,Java,Javafx,Global,Keylistener,我正在创建一个程序,让用户定义按钮,然后向合成器发送注释。 制作您自己的定制键盘 现在,这个键盘也应该对全局自定义热键做出反应 问题就在这里: 为了使它们成为全局的,我将它们附加到场景中,但是每个新设置的热键都会覆盖以前设置的热键。 有一些代码: btn.getScene().setOnKeyPressed((KeyEvent e) -> { if (e.getText().equals(hotkey)) { btn.

我正在创建一个程序,让用户定义按钮,然后向合成器发送注释。 制作您自己的定制键盘

现在,这个键盘也应该对全局自定义热键做出反应

问题就在这里: 为了使它们成为全局的,我将它们附加到场景中,但是每个新设置的热键都会覆盖以前设置的热键。 有一些代码:

        btn.getScene().setOnKeyPressed((KeyEvent e) -> {
            if (e.getText().equals(hotkey)) {
                btn.arm();
                btn.fire();
            }
        });
        btn.getScene().setOnKeyReleased((KeyEvent e) -> {
            if (e.getText().equals(hotkey)) {
                btn.disarm();
            }
        });
想到的直接解决方案是创建一个跟踪所有热键的arraylist,并让keylistener每次对其进行迭代,以及另一个带有关联按钮的arraylist


是否有一种更优雅、更直接的方法?

使用两个数组列表跟踪热键和相关按钮最终将导致您找到一个复杂的解决方案,您必须实现一种将热键和按钮关联起来的方法

基于此,使用地图似乎可以解决您的问题。具有映射到关联按钮的特定热键的键值对

查看Map上的java文档了解所有方法:


只需选择最适合您需要的实现。

这非常接近于:其中谈到了加速器。稍有不同的是,您跟踪的是新闻/发布事件,而不是加速器中使用的键入键。@jewelsea我遇到过这一个,但我希望用户能够长时间按住键。可能这应该是选项的
Map
实现:,使用
KeyCode
作为键。