2017-10-28 7 views
1

내 프로그램의 모든 버튼에 대해 바로 가기를 만들고 싶은 프로그램을 만들고 있습니다. 예를 들어, Ctrl + A를 실행하는 버튼은 1키 바인딩 및 동작 맵을 사용하여 Java 용 버튼 단축키

나는 이러한 단축키 변경 사용자에게되고 싶은

그래서 이것은 내가 이것들을 원하기 때문에 지금

InputMap IM = component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 

    IM.put(KeyStroke.getKeyStroke(KeyEvent.VK_B, InputEvent.CTRL_DOWN_MASK | 
      InputEvent.ALT_DOWN_MASK), "BUTTON ONE ID"); 

    ActionMap actionMap = component.getActionMap(); 
    actionMap.put("BUTTON ONE ID", new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      actionListener.actionPerformed(e); 
     } 
    }); 

바인딩 키를 추가 사용하고있는 코드는 사용자가 변경할 수 있기를 원한다면, 세 번째 줄에 "BUTTON ONE ID"를 사용하여 정보를 얻을 수 있기를 원합니다. 나는 그것을 위해 입력 한 키 및 바로 가기 Ctrl 키 또는 Alt를 보유 할 필요가 있는지 여부를 알 수 있도록하려면

는 그래서 난 다음 코드

if("BUTTON ONE ID"){ 
    //print KeyEvent/keyCode info and if we need to hold ctrl, alt or shift? 
    //and then i want to be able to change the key bindings 

}

를 원하는 것 "BUTTON ONE ID"를 사용하여이 작업을 수행하거나이를 수행하는 더 좋은 방법입니다. 감사합니다.

+0

난 당신이 상관 할 이유에 골동품 바인딩을 업데이트합니다. 'Action'의'actionPeformed' 메소드가 트리거 될 때, 당신은 그것을합니다. 당신이 바꾸고 싶은 것은 행동을 촉발시키는 바인딩입니다. – MadProgrammer

+0

예 키 바인딩을 변경하여 사용자가 설정 한 기본 키를 사용하지 않아도되도록하고 싶습니다. – cmptUser

+0

좋아요, 그렇다면 어떻게 키 스트로크를 캡쳐하는 법을 알아야합니까? 2 - 기존 바인딩을 제거합니다. 3 새로운 바인딩을 추가하십시오. 바인딩을 만드는 방법을 이미 알고 있으므로 세 번째 단계는 비교적 간단해야하지만 – MadProgrammer

답변

2

좋아, 사용자가 자신의 키 스트로크를 생성하는 방법에 대한 간단한 예입니다. 그것은 기본적으로 CTRL, SHIFT, ALTMETA 키의 상태를 캡처하고 마지막 아무도 "수정"키 누름을 기록하지 않습니다.

그것은 키가가,이 예에서, 당신은 키가

디버깅 완료 "형식화는"인 경우는 KeyStroke를 인쇄하는 것을 발견 할 것이다 구성된 국가에 의해 생성 될 쓰다 반환하는 간단한 getKeyStroke 방법을 제공

import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JToggleButton; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.EmptyBorder; 

public class ExampleLKeyConfig { 

    public static void main(String[] args) { 
     new ExampleLKeyConfig(); 
    } 

    public ExampleLKeyConfig() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new KeyCapturePane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class KeyCapturePane extends JPanel { 

     private JToggleButton ctrlKey; 
     private JToggleButton altKey; 
     private JToggleButton shiftKey; 
     private JToggleButton metaKey; 
     private JButton strokeKey; 

     private int keyCode; 

     public KeyCapturePane() { 
      setBorder(new EmptyBorder(10, 10, 10, 10)); 
      setLayout(new GridBagLayout()); 

      ctrlKey = new JToggleButton(KeyEvent.getModifiersExText(KeyEvent.CTRL_DOWN_MASK)); 
      altKey = new JToggleButton(KeyEvent.getModifiersExText(KeyEvent.ALT_DOWN_MASK)); 
      shiftKey = new JToggleButton(KeyEvent.getModifiersExText(KeyEvent.SHIFT_DOWN_MASK)); 
      metaKey = new JToggleButton(KeyEvent.getModifiersExText(KeyEvent.META_DOWN_MASK)); 
      strokeKey = new JButton("-"); 

      updateMetaState(new KeyEvent(this, 0, 0, 0, 0, ' ')); 

      add(ctrlKey); 
      add(altKey); 
      add(shiftKey); 
      add(metaKey); 
      add(strokeKey); 

      setFocusable(true); 
      addKeyListener(new KeyAdapter() { 

       @Override 
       public void keyPressed(KeyEvent e) { 
        updateMetaState(e); 
        int code = e.getKeyCode(); 
        if (code != KeyEvent.VK_CONTROL && code != KeyEvent.VK_ALT && code != KeyEvent.VK_SHIFT && code != KeyEvent.VK_META) { 
         strokeKey.setText(KeyEvent.getKeyText(code)); 
         keyCode = code; 
        } 
       } 

       @Override 
       public void keyReleased(KeyEvent e) { 
       } 

       @Override 
       public void keyTyped(KeyEvent e) { 
        System.out.println(getKeyStroke()); 
       } 

      }); 

      addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        requestFocusInWindow(); 
       } 
      }); 
     } 

     protected int getModifiers() { 
      return (ctrlKey.isSelected() ? KeyEvent.CTRL_DOWN_MASK : 0) 
          | (altKey.isSelected() ? KeyEvent.ALT_DOWN_MASK : 0) 
          | (shiftKey.isSelected() ? KeyEvent.SHIFT_DOWN_MASK : 0) 
          | (metaKey.isSelected() ? KeyEvent.META_DOWN_MASK : 0); 
     } 

     public KeyStroke getKeyStroke() { 
      return KeyStroke.getKeyStroke(keyCode, getModifiers()); 
     } 

     protected void updateMetaState(KeyEvent evt) { 
      updateMetaState(ctrlKey, evt.isControlDown()); 
      updateMetaState(altKey, evt.isAltDown()); 
      updateMetaState(shiftKey, evt.isShiftDown()); 
      updateMetaState(metaKey, evt.isMetaDown()); 
     } 

     protected void updateMetaState(JToggleButton btn, boolean isPressed) { 
      if (isPressed) { 
       btn.setSelected(!btn.isSelected()); 
      } 
     } 

    } 

} 

이제는 대략적인 준비가되었습니다. 테스트를하는 동안 재미있는 문자를 인쇄하여 어떤 키를 필터링할지 선택할 수 있습니다. (힌트 Caps Lock이 하나 일 수 있습니다.)

이제 이것을 손, 당신은 단지 InputMap

KeyStroke ks = ...; 
IM.put(ks, "BUTTON ONE ID"); 

을 변경해야하고 자동

+0

나는 내일 이것을 보게 될 것입니다. 도움이 – cmptUser

+0

나는이 코드를 배우는 과정에 아직도있다, 나는 프로그래밍에 너무 많은 경험이 없다. 그러나 metaKey와 updateMetaState의 의미는 무엇입니까? 고마워요! – cmptUser

+0

메타 키는 OS간에 변경되는 키입니다. Windows에서는 Windows 키이고 MacOS에서는 Command 키입니다. 'updateMetaState'는 단순히 어떤 Key 키가 눌려 졌는지를 확인하기 위해 KeyEvent의 변경자 상태를 검사합니다. 가상 키 코드를 사용하는 것이 더 쉽습니다. – MadProgrammer