【问题标题】:Java detect CTRL+X key combination on a jtreeJava 检测 jtree 上的 CTRL+X 组合键
【发布时间】:2011-08-23 16:01:49
【问题描述】:

我需要一个示例,如何添加一个键盘处理程序来检测何时 Ctrl+CCtrl+X , Ctrl+C 按下JTree

我之前是用菜单快捷键做的,但没有成功。

【问题讨论】:

  • 虽然这些建议可行,但它们确实值得-1。 Swing 旨在与 Key Bindings 一起使用,而不是 KeyListeners。请参阅:download.oracle.com/javase/tutorial/uiswing/misc/...。解决方案应该促进标准的 Swing 设计理念。使用 KeyListeners 用于不支持键绑定的旧 AWT 应用程序。
  • 请参阅 camickr's 答案以获得 Key Bindings 教程的工作链接。

标签: java keyboard-shortcuts jtree


【解决方案1】:

您可以将 KeyListeners 添加到任何组件 (f)

        f.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
            }

            @Override
            public void keyPressed(KeyEvent e) {
                if ((e.getKeyCode() == KeyEvent.VK_C) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
                    System.out.println("woot!");
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {
            }
        });

【讨论】:

  • 使用 Toolkit.getMenuShortcutKeyMask() 而不是硬编码 CTRL_MASK。并非所有平台都使用 Ctrl 作为命令的修饰符。
  • 键绑定是所有 Swing 组件使用的方法。
  • InputEvent.CTRL_MASK 已被弃用,现在建议使用扩展修饰符(例如InputEvent.CTRL_DOWN_MASK)。烦人但真实。 docs.oracle.com/javase/6/docs/api/java/awt/event/…
  • if ((e.getKeyCode() == KeyEvent.VK_C) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) { System.out.println("woot!"); } } 将处理“Alt+CTRL+C”=“CTRL+C”。提议的解决方案实际上无法与任何多个修饰符区分开来。宁可使用@Override public void keyPressed(KeyEvent e) { if ((e.getKeyCode() == KeyEvent.VK_C) && ((e.getModifiers() | KeyEvent.CTRL_MASK) == KeyEvent.CTRL_MASK)) { System.out.println("woot!"); } }
  • 出于某种原因,在我的测试中,Ctl-A 显示为 KeyCode 0 和 KeyChar 1。同样,Ctl-N 显示为 KeyChar 14。(字母表中的字母数。) Don '不知道这是否记录在某处。
【解决方案2】:

以 KeyListener 为例:

jTree1.addKeyListener(new java.awt.event.KeyAdapter() {

        public void keyPressed(java.awt.event.KeyEvent evt) {
            if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_C) {

                JOptionPane.showMessageDialog(this, "ctrl + c");

            } else if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_X) {

                JOptionPane.showMessageDialog(this, "ctrl + x");

            } else if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_V) {

                JOptionPane.showMessageDialog(this, "ctrl + v");

            }
        }
    });

希望对您有所帮助。

【讨论】:

  • 键绑定是所有 Swing 组件使用的方法。
【解决方案3】:

使用Key Bindings

【讨论】:

    【解决方案4】:
        initComponents();
          KeyboardFocusManager ky=KeyboardFocusManager.getCurrentKeyboardFocusManager();
    
        ky.addKeyEventDispatcher(new KeyEventDispatcher() {
    
            @Override
            public boolean dispatchKeyEvent(KeyEvent e) {
    
                 if (e.getID()==KeyEvent.KEY_RELEASED && (e.getKeyCode() == KeyEvent.VK_C) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
                    System.out.println("Dhanushka Tharindu");
                }
                 return  true;
            }
        });
    

    【讨论】:

    • 您还应该解释代码的工作原理。
    【解决方案5】:

    但菜单快捷键是正常执行此操作的方法:myMenuItem.setAccelerator(KeyStroke.getKeyStroke("control C"));

    【讨论】:

    • 系统保留的组合键似乎冲突加速器。我做到了,但它不起作用。有没有机会添加一个键盘处理程序来检测?
    • 是的,您可以向控件添加按键监听器,实现 onKeyPress() 并检查按键事件的修饰符。我这样做是为了检测 mousewhell + ctrl,但在你的情况下它应该也能正常工作。
    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多