如何定义小键盘的keyStroke - 输入键

时间:2013-04-17 20:18:58

标签: java swing key-bindings keystrokes

我即将在swing pad应用程序中使用键绑定来输入数字键,但键很难捕捉到。 我见过的所有例子都依赖于像      key == KeyEvent.VK_KP_LEFT

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

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

容易获得的是general和numpad-enter之间的区别: 所有小键盘键(如果在数字模式下切换,则独立)将被分配给     getKeyLocation() == 4
(我通过按下的键/键释放方法发现了这一点)

问题是:
如何正确准备numpad的keyStroke输入键在中使用它     inputMap.put(KeyStroke keyStroke, Object actionMapKey)
密钥绑定方法?

谢谢,
拉茶

2 个答案:

答案 0 :(得分:2)

如果您正在寻找绑定 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()来阻止其中一个键。

答案 1 :(得分:-1)

这个怎么样?

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