2017-10-28 6 views
1

私は私のプログラムのすべてのボタンのショートカットをしたい場所にプログラムを作っています。たとえば、CTRL +実行ボタンは1ボタンのショートカットキー用のキーバインディングとアクションマップを使用して

は、私はまた、これらのショートカットが変更ユーザーになりたい

ので、これは私がこれらをしたいので、今

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); 
     } 
    }); 

を結合キーを追加するために使用していたコードですユーザーが変更できるように、私はその情報を得るために3行目の "BUTTON ONE ID"を使用できるようにしたい。私はので、私は次のコード

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 

}

を望む私はそれのために入力したキーやショートカットのため

をCtrlキーまたはAltキーを保持する必要があるかどうかを知ることができるようにしたいですどのように "BUTTON ONE ID"を使ってこれを行うのですか、これを行うより良い方法です。おかげで

+0

を更新します。 'Action'の' actionPeformed'メソッドがトリガされると、あなたはそれを行います。あなたが変更したいと思うものは、アクションをトリガーするバインディングです – MadProgrammer

+0

はい私はキーバインディングを変更できるようにしたいので、ユーザーが設定したデフォルトのものを使用しないでください。 – cmptUser

+0

さて、キーストロークをキャプチャする方法を理解する必要があります。 2 - 既存のバインディングを削除します。 3新しいバインディングを追加します。あなたはすでにバインディングの作成方法を知っているので、3番目のステップは比較的単純なものにしてください。 – MadProgrammer

答えて

2

これはユーザーが独自のキーストロークを生成できるようにする方法の簡単な例です。それは基本的にCTRLSHIFTALTMETAキーの状態をキャプチャし、最後のどれも「修飾」キーを押して記録していません。

それはそれは、この例では、設定された状態で生成されるストローク、あなたはそれが

をデバッグするために行われている、キーが「型付け」されたときに 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が1かもしれません))

手は、あなただけのInputMap

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

を変更する必要があり、それは自動的に私はあなたが気になり理由として骨董バインディング

+0

私はこの明日を見ていきます助け – cmptUser

+0

私はまだこのコードを学ぶ過程にある、私はプログラミングであまりにも多くの経験を持っていない。しかし、metaKeyとupdateMetaStateは何を意味しますか?どうもありがとう! – cmptUser

+0

メタ鍵はOS間で変わる鍵です。私はそれがWindows上のWindows鍵であろうと思っていますし、MacOSではCommand鍵です。 'updateMetaState'は単に' KeyEvent'の修飾子の状態をチェックして、どの修飾キーが押されたかを確認します。それで簡単に仮想キーコードを使用しようとします – MadProgrammer

関連する問題