Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅在用户键入某个组件时禁用自定义快捷键,并在java中焦点不在可编辑组件时再次启用它?_Java_Focus_Keyboard Shortcuts_Keyevent_Jtextcomponent - Fatal编程技术网

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

如何仅在用户键入某个组件时禁用自定义快捷键,并在java中焦点不在可编辑组件时再次启用它?,java,focus,keyboard-shortcuts,keyevent,jtextcomponent,Java,Focus,Keyboard Shortcuts,Keyevent,Jtextcomponent,我使用以下代码为我的JFrame设置快捷键 KeyboardFocusManager keyManager; keyManager=KeyboardFocusManager.getCurrentKeyboardFocusManager(); keyManager.addKeyEventDispatcher(new KeyEventDispatcher() { @Override public boolean dispatchKeyEvent(KeyEvent e){

我使用以下代码为我的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;
}});
而且效果很好!但问题是,当用户在某些文本字段或表格单元格等中写入某些内容,并希望写入任何大写字母时,比如说Compose,然后按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
}

创建一个可编辑字段列表,并使用if语句循环遍历所有可编辑字段,如果其中一个字段有焦点,则不处理快捷键;或者,确保每个可编辑字段都有一个焦点/取消焦点事件,该事件为快捷键设置一个布尔值,以检查它们是否应触发?感谢您的评论!我也想到了这一点,但我希望能找到一种解决办法,因为我的项目中有太多的字段,甚至还有一些可编辑的表。可能类似于UIManger.put(“JTEXTFIELD.isfocused”,“禁用快捷键”);所有可编辑字段的类型代码。顺便说一句,我使用UIManager为所有JLabel设置禁用的文本颜色,这就是为什么我在这里引用它。您可以完全做到这一点,只需在列表周围制作一个包装器,以保留对可编辑对象的引用。或者,如果(yourJFrame.getFocusOwner().isEditable==false){do short keys here},只需在每个短键
中添加一个检查,但在某些情况下可能会出错。