【问题标题】:How to define the keyStroke for the numpad - enter key如何为小键盘定义 keyStroke - 输入键
【发布时间】:2013-04-17 20:18:58
【问题描述】:

我即将在一个摇摆应用程序中为数字键盘输入键使用键绑定,但该键很难抓住。 我见过的所有示例都依赖于类似
key == KeyEvent.VK_KP_LEFT

其中 VK_KP_LEFT 是一些预定义的值。其他选项是定义这样的按键:
KeyStroke.getKeyStroke("control A");
KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);

但我还没有找到小键盘的“修饰符”。

很容易得到的是general和numpad-enter的区别: 所有小键盘键(无论是否切换到数字模式)都被分配了
getKeyLocation() == 4
(我从按键/按键释放方法中发现了这一点)

问题是:
如何为小键盘输入键正确准备keyStroke以在
inputMap.put(KeyStroke keyStroke, Object actionMapKey)
中使用 键绑定方法?

谢谢,
塔里克

【问题讨论】:

    标签: java swing key-bindings keystrokes


    【解决方案1】:

    如果您正在寻找绑定 Enter 键,您可以使用KeyEvent.VK_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_ENTER 与主键盘

    经过一些测试,似乎无法单独绑定这些键。 为两个密钥生成相同的KeyStrokeJComponent.processKeyBinding 的实现不检查KeyEvent,它只关心KeyStroke 以便找到所需的操作。

    负责调度实际操作的SwingUtilities.notifyAction 不会委托KeyEvent 的所有细节(只有键、修饰符和何时)。所以内部行动也没有办法区分,因为ActionEvent 中没有细节。

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

    【讨论】:

    • 虽然技术上正确,因为它应该响应两个输入键,但我相信 OP 希望将操作限制为键盘输入键
    • @MadProgrammer 是的,我可能误解了这个问题。可能无法区分这两个键。我想知道OP是否可以提供更多详细信息。
    【解决方案2】:

    这个怎么样?

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

    【讨论】:

    • 恕我直言,这不是关于 Key Listeners 的问题,而是关于 Key bindings 的问题,它不可能在激活键时确定 KeyEvent 的位置
    • 感谢您的帮助。似乎,很难仅绑定到 numpad_enter 。目前,我不确定是否值得为昂贵的解决方案或将设计更改为关键听众而烦恼。最后,代码应该符合要求并且看起来不应该比需要的更难:-)。干杯,塔里克
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2017-05-04
    • 2014-04-18
    • 1970-01-01
    • 2021-06-21
    • 2012-09-10
    相关资源
    最近更新 更多