3

나는 자바 스윙 응용 프로그램을 개발 중입니다. 키보드 바로 가기를 추가하려고합니다. CTRL       + H 클릭하면 jButton1과 동일한 작업이 수행됩니다.자바에서 사용자 정의 키보드 단축키

이 바로 가기는 jButton1에 포커스가 맞지 않아도 동일한 방식으로 동작해야합니다.

KeyEventDispatcher로 시도했지만 실제로 작동하지 않습니다. 다른 방법이 있습니까?

+0

스윙 구성 요소를 동적으로 생성 하시겠습니까? 우리는 컴포넌트에 단축키를 추가 할 수는 있지만 애플리케이션 전반에는 단축키를 추가 할 수 없다 - 'component.getInputMap(). put (aKeyStroke, aCommand);' – Chan

답변

1

발견 될 수 있다고 생각합니다. 오라클의 TextComponentDemo (약간 수정,하지만 여전히 예로서 DefaultEditorKit 사용)에서 :

// CTRL + H 
KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.CTRL_MASK); 
// bind the keystroke to an object 
inputMap.put(key, DefaultEditorKit.backwardAction); 

당신이 이벤트가 구성 요소에 포커스가없는 경우에도 해고 할 때 Key Listeners 이상을 사용

Key listeners are also difficult if the key binding is to be active when the component doesn't have focus.을 대신 수정으로 키 명시 적으로 컨트롤을 사용

1

MASK 사용 더 나은 교차 플랫폼 사용자 환경을 위해 getMenuShortcutKeyMask()에 의해 반환되었습니다. ImageAppexample입니다.

2

Ok - 먼저 Java Swing에서 응용 프로그램의 다양한 바로 가기를 설정할 방법이 없다고 생각합니다 (이 question 참조). 그러나 구성 요소의 경우 가능합니다.

KeyStroke에 대해 Action을 사용해야합니다. 하지만 Windows의 경우이 라이브러리는 매우 helpful입니다.

{ 
     KeyStroke cancelKeyStroke = KeyStroke 
       .getKeyStroke((char) KeyEvent.VK_ESCAPE); 
     Keymap map = JTextComponent.getKeymap(JTextComponent.DEFAULT_KEYMAP); 
     map.addActionForKeyStroke(cancelKeyStroke, cancelKeyAction); 
    } 
    private static Action cancelKeyAction = new AbstractAction() { 
     public void actionPerformed(ActionEvent ae) { 
      Component comp = (Component) ae.getSource(); 
      Window window = SwingUtilities.windowForComponent(comp); 
      if (window instanceof Dialog) { 
       window.dispose(); 
      } else if (comp instanceof JTextComponent 
        && !(comp instanceof JFormattedTextField)) { 
       JTextComponent tc = (JTextComponent) comp; 
       int end = tc.getSelectionEnd(); 
       if (tc.getSelectionStart() != end) { 
        tc.setCaretPosition(end); 
       } 
      } 
     } 
    };