Swing中如何实现快捷键绑定和修改

在许许多多市面上常见的桌面软件中, 可以使用快捷键操作, 比如像微信一样,使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值