2011-08-03 29 views
2

私はJFrameと3つのJButtonを持つJavaプログラムを持っています。 jframeにキーリストを追加しました。プログラムを実行すると、jframeウィンドウが開き、最初のボタンがデフォルトで選択されます。私の問題は、このJFrameによってKeyEventが生成されていないことです。 今、jListにKeyListenerを追加するだけでなく、ボタンにKeyListenerも追加しました。 ボタンによってキーイベントが生成されています。JFrame javaではKeyEventが生成されていませんか?

JFrameで生成するJButtonの代わりにKeyEventを生成させるにはどうすればよいですか?

実際、私の主な目的は、ボタンのキーボードショートカットを構築することです。

答えて

4

に呼ばれては、こちらをご覧How to Use Key Bindingsを持っています。
keylistenerの代替品です。

ここには少し例があります。フォーカスのあるButtonがあり、KeyEvent(F2)を処理します。
F2キーを押したキーバインディングで、System.outの印刷を実行したButtonClickで処理されました。

public class Example { 
    static public void main(String[] s) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.getContentPane().setLayout(new BorderLayout()); 
       frame.setBounds(50, 50, 600, 600); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       final JButton button = new JButton(new AbstractAction("MyButton") { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         System.out.println("Button Clicked"); 
        } 
       }); 
       frame.getContentPane().add(button); 
       frame.getRootPane().setDefaultButton(button); 

       KeyStroke f2 = KeyStroke.getKeyStroke("F2"); 
       frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(f2, "clickButton"); 
       frame.getRootPane().getActionMap().put("clickButton", new AbstractAction() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         button.doClick(); 
        } 
       }); 
       frame.setVisible(true); 
       // the Button has the focus 
       button.requestFocus(); 
       // generate a KeyEvent 'F2' 
       KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent(new KeyEvent(frame, KeyEvent.KEY_PRESSED, 0, f2.getModifiers(), f2.getKeyCode(), f2.getKeyChar())); 
      } 
     }); 
    } 
} 
+1

お返事いただきありがとうございます...しかし、getInputMap()メソッドとput()メソッドが何をしているのか説明してください。どんな助けでも大歓迎です – Shantanu

+0

+1、SwingはKey Bindingsを使用するように設計されています。チュートリアルでは、これらの方法について説明します。チュートリアルの説明を混乱させることがわからない場合は、追加のヘルプを提供することはできません。おそらく、私の小さな[Key Bindings](http://tips4java.wordpress.com/2008/10/10/key-bindings/)ユーティリティは、使用するInputMapの理解を深めるのに役立ちます。 – camickr

4

キーイベントが(通​​常JFrameではありません)現在フォーカスされているコンポーネント

+0

jframeからキーイベントを生成する方法はありますか? – Shantanu

+0

実際には、明るい側の関連コンポーネントにリスナーを登録する必要があります - 同じリスナーを登録することができます:) http://stackoverflow.com/questions/286727/java-keylistener-for- jframe-is-being-unresponsive – MByD

+0

はい、KeyEventsではなくKey Bindingsを使用してください。 SwingはKey Bindingsを使用するように設計されています。 – camickr

関連する問題