我有一个包含许多功能的Java应用程序,为了让用户的生活更轻松,我设置了许多助记符和加速器。例如,我有一个允许用户保存应用程序状态的JMenuItem,代码如下:
JMenuItem saveItem = new JMenuItem("Save");
saveItem.setMnemonic('S');
saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
这可以按预期工作,但现在我想给用户一个更改热键的选项。虽然CTRL + s似乎是一个相当明显的热门关键,但有许多功能使用这些快捷方式,只需选择Save作为示例。
我有一个JButton,我已安排进行测试,允许用户在单击时输入新的快捷方式。我在想我只是尝试捕获用户按下的键(InputEvent)并按下(KeyEvent)。我也强调使用InputMask来避免文本字段等的复杂化。
我想知道的是:捕获用户输入的新输入的最佳方法是什么?我查找了有关KeyBindings的信息,他们看起来正确的工作,但我看到的主要问题实际上是捕获密钥并保存它们。
答案 0 :(得分:2)
听起来您需要设置KeyListener
。当用户按下/释放键时,它会触发KeyEvent
,您可以从中检索按下的主键(例如 S )和掩码/修饰符(例如 CTRL + SHIFT )。
从那里你可以创建一个KeyStroke
对象并将其设置为菜单的新加速器。
public void keyReleased(KeyEvent e){
KeyStroke ks = KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers());
menuItem.setAccelerator(ks);
}
问题是你可能希望在密钥释放事件之后立即删除此密钥监听器,以避免捕获多次击键。所以你可以有这样的逻辑:
JButton captureKeyButton = new JButton("Capture key");
JLabel captureText = new JLabel("");
KeyListener keyListener = new KeyAdapter(){
public void keyReleased(KeyEvent e){
KeyStroke ks = KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers());
menuItem.setAccelerator(ks);
captureText.setText("Key captured: "+ks.toString());
captureKeyButton.removeKeyListener(this);
}
};
ActionListener buttonClicked = new ActionListener(){
public void actionPerformed(ActionEvent e){
captureKeyButton.addKeyListener(keyListener);
captureText.setText("Please type a menu shortcut");
}
};
captureKeyButton.addActionListener(buttonClicked);