문제

Java Swing 애플리케이션에 대한 애플리케이션 전체 키보드 단축키를 만들고 싶습니다.모든 구성 요소를 반복하고 각 구성 요소에 바로 가기를 추가하면 포커스 관련 부작용이 있으며 무차별 대입 솔루션처럼 보입니다.

누구든지 더 깨끗한 솔루션을 가지고 있습니까?

도움이 되었습니까?

해결책

사용자 정의 KeyEventDispatcher를 설치합니다.KeyboardFocusManager 클래스도 이 기능을 사용하기에 적합합니다.

키이벤트디스패처

다른 팁

각 창에 대해 다음을 사용하십시오. JComponent.registerKeyboardAction 의 조건으로 WHEN_IN_FOCUSED_WINDOW.또는 다음을 사용하십시오.

JComponent.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(keyStroke, command);
JComponent.getActionMap().put(command,action);

에 설명된 대로 RegisterKeyboardAction API 문서.

나처럼 KeyEventDispatcher를 사용하는 방법을 궁금해하는 사람들을 위해 여기에 제가 정리한 예가 있습니다.나는 큰 것을 좋아하지 않기 때문에 모든 전역 작업을 저장하기 위해 HashMap을 사용합니다. if (key == ..) then .. else if (key == ..) then .. else if (key ==..) .. 구성합니다.

/** map containing all global actions */
private HashMap<KeyStroke, Action> actionMap = new HashMap<KeyStroke, Action>();

/** call this somewhere in your GUI construction */
private void setup() {
  KeyStroke key1 = KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK);
  actionMap.put(key1, new AbstractAction("action1") {
    @Override
    public void actionPerformed(ActionEvent e) {
      System.out.println("Ctrl-A pressed: " + e);
    }
  });
  // add more actions..

  KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
  kfm.addKeyEventDispatcher( new KeyEventDispatcher() {

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
      KeyStroke keyStroke = KeyStroke.getKeyStrokeForEvent(e);
      if ( actionMap.containsKey(keyStroke) ) {
        final Action a = actionMap.get(keyStroke);
        final ActionEvent ae = new ActionEvent(e.getSource(), e.getID(), null );
        SwingUtilities.invokeLater( new Runnable() {
          @Override
          public void run() {
            a.actionPerformed(ae);
          }
        } ); 
        return true;
      }
      return false;
    }
  });
}

SwingUtils.invokeLater()를 사용할 필요는 없을 수도 있지만 전역 이벤트 루프를 차단하지 않는 것이 좋습니다.

메뉴가 있으면 메뉴 항목에 전역 키보드 단축키를 추가할 수 있습니다.

    JMenuItem item = new JMenuItem(action);
    KeyStroke key = KeyStroke.getKeyStroke(
        KeyEvent.VK_R, KeyEvent.CTRL_DOWN_MASK);
    item.setAccelerator(key);
    menu.add(item);

조금 단순화된 예:

KeyboardFocusManager keyManager;

keyManager=KeyboardFocusManager.getCurrentKeyboardFocusManager();
keyManager.addKeyEventDispatcher(new KeyEventDispatcher() {

  @Override
  public boolean dispatchKeyEvent(KeyEvent e) {
    if(e.getID()==KeyEvent.KEY_PRESSED && e.getKeyCode()==27){
      System.out.println("Esc");
      return true;
    }
    return false;
  }

});

다음 코드 조각을 사용하십시오

ActionListener a=new ActionListener(){
   public void actionPerformed(ActionEvent ae)
   {
    // your code
   }
};
getRootPane().registerKeyboardAction(a,KeyStroke.getKeyStroke("ctrl D"),JComponent.WHEN_IN_FOCUSED_WINDOW);

"ctrl D"를 원하는 단축키로 바꾸세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top