在许许多多市面上常见的桌面软件中, 可以使用快捷键操作, 比如像微信一样,使用Alt+A 可以打开截图窗口,如果不习惯于Alt+A按键时,还可以打开设置去修改。
如果在swing中也想实现一个快捷键绑定和修改的操作,那么应该如何操作?
一、实现思路
1.1创建事件Action
创建一个Action 对象,实现actionPerformed方法即可。
// 该事件触发时, 会弹出bindKeyMapButton按钮上绑定的按键值。
Action actionListener = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
MessageUtil.ok(bindKeyMapButton, "Key:" + SwingCoreUtil.keyStroke2Str((KeyStroke) bindKeyMapButton.getClientProperty("activeKeyStroke")));
}
};
1.2.为按钮绑定默认快捷键
创建一个KeyStroke按键,绑定键盘Ctrl+Q ,那么键盘按下Ctrl+Q时,会触发事件Action
KeyStroke defaultKeyStroke = KeyStroke.getKeyStroke("ctrl Q");
bindKeyMapButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(defaultKeyStroke, "active");
bindKeyMapButton.getActionMap().put("active", actionListener);
bindKeyMapButton.putClientProperty("activeKeyStroke", defaultKeyStroke);
1.3. 创建Jtextfield来监听键盘事件
当键盘被按下时,记录符合要求的按键值,并显示文本到输入框内。
keymapText.addKeyListener(new KeyAdapter() {
private KeyStroke keyStroke;
@Override
public void keyPressed(KeyEvent e) {
keyStroke = null;
// 无ctrl/shift/alt 组合键
if (e.getModifiersEx() == 0 || e.getKeyCode() == KeyEvent.VK_UNDEFINED) {
keyStroke = null;
} else {
keyStroke = KeyStroke.getKeyStrokeForEvent(e);
}
}
@Override
public void keyReleased(KeyEvent e) {
if (keyStroke == null) {
return;
}
int keyCode = keyStroke.getKeyCode();
// 禁止某些键
if (keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_SHIFT
|| keyCode == KeyEvent.VK_ALT || keyCode == KeyEvent.VK_ALT_GRAPH
|| keyCode == KeyEvent.VK_SCROLL_LOCK || keyCode == KeyEvent.VK_PRINTSCREEN
) {
return;
}
String keyStrokeText = SwingCoreUtil.keyStroke2Str(keyStroke);
keymapText.setText(keyStrokeText);
keymapText.putClientProperty("bindKeyStroke", keyStroke);
}
});
1.4. 监听Jtextfield文本变化更新button的按键绑定
对button移除按键操作,并绑定Jtextfield中设置的新按键值。
keymapText.getDocument().addDocumentListener(new ChangeDocumentListener() {
@Override
public void update(DocumentEvent e) {
bindKeyMapButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).remove((KeyStroke) bindKeyMapButton.getClientProperty("activeKeyStroke"));
KeyStroke keyStroke = (KeyStroke) keymapText.getClientProperty("bindKeyStroke");
if (keyStroke != null) {
bindKeyMapButton.putClientProperty("activeKeyStroke", keyStroke