【问题标题】:Performing a certain task after pressing "ctrl" + "alt" + "backspace"按“ctrl”+“alt”+“backspace”后执行某项任务
【发布时间】:2012-10-06 13:43:10
【问题描述】:

当我想执行某项操作时,我该如何编写代码。假设当用户同时按下 ctrl+alt+backspace 时,JTextField 上的焦点和消息框会弹出。

【问题讨论】:

  • 您将为此使用键绑定,并了解如何使用 Google 的教程,因为它应该可以帮助您入门。
  • 谢谢您,先生。我目前正在阅读键绑定教程
  • 不确定 CTRL + ALT + BACK_SPACE 是否不是 JTextComponents 中的内置 KeyBindings ???,
  • @mkorbel:可能是这样,但我认为你可以覆盖它的行为。
  • 退格键可以替换成任意键。 XD 使它更容易。感谢 cmets

标签: java swing popup jtextfield key-bindings


【解决方案1】:

键绑定示例:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class JTextFieldMagic {
   public static final String CTRL_ALT_BACK_SPACE = "ctrlAltBackspace";

   public static void main(String[] args) {
      JTextField field = new JTextField(10);

      int condition = JComponent.WHEN_FOCUSED;
      InputMap inputmap = field.getInputMap(condition);
      ActionMap actionMap = field.getActionMap();

      KeyStroke ctrlAltBackSpaceKeyStroke = KeyStroke.getKeyStroke(
            KeyEvent.VK_BACK_SPACE, 
            KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK);

      inputmap.put(ctrlAltBackSpaceKeyStroke, CTRL_ALT_BACK_SPACE);
      actionMap.put(CTRL_ALT_BACK_SPACE, new CtrlAltBackspaceAction());

      JOptionPane.showMessageDialog(null, field);
   }
}

class CtrlAltBackspaceAction extends AbstractAction {
   @Override
   public void actionPerformed(ActionEvent e) {
      System.out.println(JTextFieldMagic.CTRL_ALT_BACK_SPACE);
   }
}

【讨论】:

    【解决方案2】:

    另外,如果您使用“应用程序全局密钥侦听器”,您可以使用KeyboardFocusManager.addKeyEventDispatcherToolkit.addAWTEventListener

    KeyboardFocusManager.addKeyEventDispatcher

    public class GloablKeyListener {
    
        public static void main(String[] args) {
            new GloablKeyListener();
        }
    
        public GloablKeyListener() {
    
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException ex) {
                    } catch (InstantiationException ex) {
                    } catch (IllegalAccessException ex) {
                    } catch (UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setLayout(new BorderLayout());
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane());
                    frame.setSize(200, 200);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
    
                }
            });
    
        }
    
        protected class TestPane extends JPanel {
    
            private JLabel label;
    
            public TestPane() {
    
                setLayout(new BorderLayout());
                label = new JLabel("Nothing happening here");
                label.setHorizontalAlignment(JLabel.CENTER);
                add(label);
    
                KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
    
                    @Override
                    public boolean dispatchKeyEvent(KeyEvent e) {
    
                        if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE && e.isControlDown() && e.isAltDown()) {                            
                            label.setText("Hit me");                        
                        } else {
                            label.setText("Nothing to see here...");
                        }
    
                        return false;
                    }
                });    
            }
        }
    }
    

    Toolkit.addAWTEventListener

    public class GloablKeyListener {
    
        public static void main(String[] args) {
            new GloablKeyListener();
        }
    
        public GloablKeyListener() {
    
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException ex) {
                    } catch (InstantiationException ex) {
                    } catch (IllegalAccessException ex) {
                    } catch (UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setLayout(new BorderLayout());
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane());
                    frame.setSize(200, 200);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
    
                }
            });
    
        }
    
        protected class TestPane extends JPanel {
    
            private JLabel label;
    
            public TestPane() {
    
                setLayout(new BorderLayout());
                label = new JLabel("Nothing happening here");
                label.setHorizontalAlignment(JLabel.CENTER);
                add(label);
    
                Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
                    @Override
                    public void eventDispatched(AWTEvent event) {
                        if (event instanceof KeyEvent) {
                            KeyEvent ke = (KeyEvent) event;
                            if (ke.getID() == KeyEvent.KEY_TYPED) {
                                if (ke.getKeyCode() == KeyEvent.VK_BACK_SPACE && ke.isControlDown() && ke.isAltDown()) {
                                    label.setText("Hit me");
                                } else {
                                    label.setText("Nothing to see here...");
                                }
                            }
                        }
                    }
                }, AWTEvent.KEY_EVENT_MASK);
    
            }
        }
    }
    

    就个人而言,我更喜欢KeyboardFocusManager.addKeyEventDispatcher。它更简单易用。

    您可以设置自己的 singlton 管理器,您可以在其中分配 KeyStrokes 和 Actions,就像键绑定一样。

    【讨论】:

    • 用牙签扔导弹 ;-)
    • @kleopatra 你知道我喜欢你的反馈;),可以详细说明一下,这样我就可以停止自欺欺人了;P
    • 你似乎喜欢感觉一个傻瓜没有什么完全愚蠢的 - 只是:这个问题很模糊,很明显来自一个新手,画大武器是不合适的(海事组织!)。有几个级别的键绑定(每个实例、父映射中的每个类型、焦点窗口...)的侵入性较低的选项取决于 OP 在诉诸您之前所追求的确切建议 - 有时完全有效 - 将是必要的。
    • @kleopatra 是的,你是对的,我喜欢看傻瓜,似乎让你开心 ;)。关于这个问题的好点是模糊的。在您第一次发表评论后,我有了使用 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 或 WHEN_IN_FOCUSED_WINDOW 的想法:P - 感谢您的反馈,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2012-01-04
    • 2013-05-12
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多