Java 如何定义numpad-enter键的击键

Java 如何定义numpad-enter键的击键,java,swing,key-bindings,keystrokes,Java,Swing,Key Bindings,Keystrokes,我将在swing应用程序中为num pad enter键使用键绑定,但该键很难捕捉。 我看到的所有例子都依赖于类似 key==KeyEvent.VK\u KP\u LEFT 其中,VK_KP_LEFT是一些预定义的值。其他选项是定义一个keystoke,如下所示: KeyStroke.getKeyStroke(“控制A”) KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_掩码) 但是我还没有找到numpad的“修饰符” 很容易得到的是将军

我将在swing应用程序中为num pad enter键使用键绑定,但该键很难捕捉。 我看到的所有例子都依赖于类似
key==KeyEvent.VK\u KP\u LEFT

其中,VK_KP_LEFT是一些预定义的值。其他选项是定义一个keystoke,如下所示:
KeyStroke.getKeyStroke(“控制A”)
KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_掩码)

但是我还没有找到numpad的“修饰符”

很容易得到的是将军和努帕德输入之间的区别: 所有numpad键(如果在数字模式下切换或未切换,则为独立键)都被分配了
getKeyLocation()==4

(我通过按键/按键释放方法发现了这一点)

问题是:
如何正确准备numpad enter键的击键,以便在
inputMap.put(击键击键,对象动作映射键)

密钥绑定方法

谢谢,

Tarik

如果要查找绑定Enter键,可以使用
KeyEvent.VK\u Enter
,即:

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "someAction");
getActionMap().put("someAction", someAction);
下面是一个简短的例子:

import java.awt.event.*;
import javax.swing.*;

public class Test {
    public static void main(String[] args) throws Exception {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.add(new JLabel("Hit Enter"));

        Action someAction = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "Got it");
            }
        };

        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
                KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "someAction");
        panel.getActionMap().put("someAction", someAction);

        frame.add(panel);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
编辑:VK\u在数字键盘和主键盘上输入

经过一些测试后,看起来可能无法单独绑定这些密钥。 为两个键生成相同的
击键
JComponent.processKeyBinding的实现不检查
KeyEvent
,它所关心的只是
击键
,以找到所需的操作

负责分派实际操作的notifyAction不会委派
KeyEvent
的所有详细信息(仅键、修饰符和时间)。因此,在动作内部也无法区分,因为
ActionEvent
中没有详细信息

如果值得麻烦的话,您可以重写
processKeyBinding
,并在需要时添加一些逻辑。您还可以使用
KeyboardFocusManageraddKeyEventDispatcher()
阻止其中一个键

这个怎么样

if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD 
&& keyEvent.getKeyCode() == KeyEvent.VK_ENTER)

恕我直言,这不是关于键侦听器的问题,而是关于键绑定的问题,在激活键时不可能确定键事件的位置谢谢您的帮助。似乎很难只绑定到numpad_enter。目前,我不确定是否值得费心去寻找昂贵的解决方案或将设计更改为key listener。最后,代码应该与需求相匹配,并且看起来不应该比需要的更难:-)。干杯,塔里克虽然技术上是正确的,因为它应该响应两个回车键,但我相信OP希望将操作限制在键盘回车上key@MadProgrammer没错,我可能误解了这个问题。可能无法区分这两个键。我想知道OP能否提供更多细节。