如何仅在用户键入某些组件时禁用自定义快捷键,并在焦点不在Java中的可编辑组件上时再次启用它?

问题描述

我正在使用以下代码为JFrame设置快捷键。

KeyboardFocusManager keyManager;
keyManager=KeyboardFocusManager.getCurrentKeyboardFocusManager();
keyManager.addKeyEventdispatcher(new KeyEventdispatcher() {
     @Override
     public boolean dispatchKeyEvent(KeyEvent e){
          if(e.getID()==KeyEvent.KEY_pressed && e.getKeyCode()==KeyEvent.VK_C && e.isShiftDown()){
               //shift+c
               opencalculator();
          }
     return false;
}});

工作正常!但是问题是,当用户在某些文本字段或表格单元格等中写东西,并且想要写任何大写字母时,假设 C 并按Shift + C进行大写,则我的代码将其接受为快捷键,而不是写大写字母来触发事件。

我想做的是在整个程序中禁用所有可编辑单元格,字段等的事件,并在可编辑组件失去焦点时再次启用该事件。 我希望快捷键仅在用户未编辑任何字段或在程序中编写内容时才起作用。

解决方法

我通过检查KeyDispatchEvent来解决此问题,方法是确定不希望事件集中发生在其中的组件的特定实例。

boolean check = true;
try 
{
    Component comp = FocusManager.getCurrentManager().getFocusOwner();
    if(comp instanceof JTextField || comp instanceof JTextArea || comp instanceof JComboBox || comp instanceof JTable){
         check = false;
     } 
     } catch (Exception ee) { ee.printStackTrace();
        check = true;
      }
}
if (check)
{
      //do something
}