允许用户在运行时Java

时间:2015-07-14 08:08:47

标签: java swing key-bindings

我有一个包含许多功能的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的信息,他们看起来正确的工作,但我看到的主要问题实际上是捕获密钥并保存它们。

1 个答案:

答案 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);