我即将在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)
密钥绑定方法?
谢谢,
拉茶
答案 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
经过一些测试后,看起来可能无法单独绑定这些密钥。
为两个密钥生成相同的KeyStroke
。 JComponent.processKeyBinding
的实施不会检查KeyEvent
,所有关注的都是KeyStroke
,以便找到所需的操作。
SwingUtilities.notifyAction
不会委托KeyEvent
的所有细节(仅限键,修饰符以及何时)。所以内部行动无法区分,因为ActionEvent
中没有细节。
如果值得这么麻烦,你可以覆盖processKeyBinding
并在需要时添加一些逻辑。您还可以使用KeyboardFocusManageraddKeyEventDispatcher()
来阻止其中一个键。
答案 1 :(得分:-1)
这个怎么样?
if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD
&& keyEvent.getKeyCode() == KeyEvent.VK_ENTER)