0

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

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

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

很容易获得的是通用和小键盘输入之间的区别:所有小键盘键(无论是否切换到数字模式)都被分配
getKeyLocation() == 4
(我从按键/按键释放方法中发现了这个)

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

谢谢,
塔里克

4

2 回答 2

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 与主键盘

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

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

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

于 2013-04-17T20:31:29.157 回答
-1

这个怎么样?

if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD 
&& keyEvent.getKeyCode() == KeyEvent.VK_ENTER)
于 2013-04-17T20:40:56.167 回答