2017-11-29 76 views
0

キーバインダーの仕組みを学ぶだけで、Javaチュートリアルから誤解されているようです。これはコードです:キーバインドが機能しない、アクションが実行されない

public class KeyBinder { 

    public static void main(String[] args) { 

     //making frame and label to update when "g" key is pressed. 

     JLabel keybinderTestLabel; 

     JFrame mainFrame = new JFrame(); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setSize(300,75); 
     mainFrame.setLocationRelativeTo(null); 
     mainFrame.setVisible(true); 

     keybinderTestLabel = new JLabel("Press the 'g' key to test the key binder."); 
     mainFrame.add(keybinderTestLabel); 

     Action gPressed = new AbstractAction(){ 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       keybinderTestLabel.setText("Key Binding Successful."); 
       System.out.println("Key Binding Successful."); 
       //Testing to see if the key binding was successful. 
      } 

     }; 


     keybinderTestLabel.getInputMap().put(KeyStroke.getKeyStroke("g"), "gPressed"); 
     keybinderTestLabel.getActionMap().put("gPressed", gPressed); 
     /* 
     * from my understanding, these two lines map the KeyStroke event of the g key 
     * to the action name "gpressed", then map the action name "gpressed" to the action 
     * gpressed. 
     * 
     */ 
    } 

} 

私が理解から、私はアクションgPressedにそれをマッピングし、その後、アクション名「gPressed」にGキーストロークをマッピングされました。しかし何らかの理由で、プログラムを実行するときにgキーを押してもテキストラベルが更新されません。ここで何が問題なの?実際にキーボードのgキーにマップされていない "g"キーストロークですか?

答えて

3

だから、のJavaDocから

public final InputMap getInputMap() は、コンポーネントにフォーカスがあるとき を使用しているInputMapを返します。これは getInputMap(WHEN_FOCUSED)の便利な方法です。 JLabel以来

がフォーカス可能ではない、これはまた、

keybinderTestLabel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW). //... 

...代わりに、あなたは例えば、異なる焦点条件を指定する必要があり、働くことはありませんが、これは個人的な好みです。.. KeyStroke.getKeyStroke("g")を使ってKeyStroke.getKeyStrokeを使用すると問題が発生する可能性があります。具体的には、その意味で非常に正確である必要があり、正確にどのように動作するかを覚えていません(過度に文書化されていません)。

最初の提案は、問題を解決するために失敗した場合、また、(1+) `KeyStroke.getKeyStroke( "G")は`

+1

代わりKeyStroke.getKeyStroke(KeyEvent.VK_G, 0)を使用してみてください - 動作しません。 Stringを使用する場合は、 'KeyStroke.getKeyStroke(" G ")'を使用できます。キーボードの "g"を押すための綴じ具を登録する場合。文字列を使用すると、基本的にはKeyEvent.VK _ ???の後にテキストが表示されます。したがって、 'KeyStroke.getKeyStroke(" ENTER ")'を使って "Enter"キーを聞くこともできます。または、理解しやすい文字パラメータを使用することです: 'KeyStroke.getKeyStroke( 'g')'、 – camickr

+0

ああありがとう!しかし、getKeyStroke(KeyEvent.VK_G、0)では、0パラメータは何をしていますか? – Psear

+0

@Psearモディファイア(シフト/アルト/コントロール) – MadProgrammer