EnterKeyに反応するButtonを配置する


JButtonにActionListenerを登録したプログラムで、ButtonにFocusが当たっている時、EnterKeyを押しても反応しません。
つまり、EnterKeyを押してもActionEventは発生しません。
KeyListenerインターフェースを実装し、KeyEventをハンドルすれば、EnterKeyを感知できます。

sampleでは、KeyEventのリスナーとして、KeyListenerインターフェースのメソッドを空で実装した抽象クラスである
KeyAdapterクラスを継承しています。
Adapterクラスを使えば、インターフェースを実装する時のようにインターフェースの持つ全てのメソッドを定義する必要がなく、
自分が必要なメソッドだけを実装すれば良いからです。

import  java.awt.*;
import  java.awt.event.*;
import  javax.swing.*;

class  ExamJButtonEnter   extends  JFrame {
    JButton  jb1, jb2;
    JPanel  jp;
    public  static  void  main(String  args[])  {
        ExamJButtonEnter  ejbe  =  new  ExamJButtonEnter();
        ejbe.addWindowListener(new  WindowAdapter() {
            public  void  windowClosing(WindowEvent  we)  {
                 System.exit(0);
            }
        });
        ejbe.setBounds(20,50,300,200);
        ejbe.setVisible(true);

    }
    ExamJButtonEnter()  {
        super("Button  click");
        jb1   =   new  JButton("Green");
        jb2   =   new  JButton("Yellow");

     //  create  ActionListener
        ExamActionListener  eal   =    new  ExamActionListener();
     // set  actionListener  to  JButton
        jb1.addActionListener(eal);
        jb2.addActionListener(eal);

     //  create  KeyListener
        ExamKeyAdapter  eka   =    new  ExamKeyAdapter();
     // set  KeyListener  to  JButton
        jb1.addKeyListener(eka);
        jb2.addKeyListener(eka);

        jp    =  new JPanel();
        jp.add(jb1);
        jp.add(jb2);
        getContentPane().add(jp, BorderLayout.SOUTH);       
    }
   class  ExamActionListener  implements  ActionListener    {
        public   void  actionPerformed(ActionEvent   ae)  {
            if(ae.getSource()  ==  jb1)  {
                 jp.setBackground(Color.green);
            }
            if(ae.getSource()  ==  jb2)  {
                 jp.setBackground(Color.yellow);
            }
        }    
    }

   class  ExamKeyAdapter  extends  KeyAdapter    {
  
        public   void  keyPressed(KeyEvent   ke)  {
            if(ke.getKeyCode()  ==  KeyEvent.VK_ENTER)  {
                 System.out.println("Pressed  Enter");
            }
            if(ke.getSource()  ==  jb1)  {
                 jp.setBackground(Color.green);
            }
            if(ke.getSource()  ==  jb2)  {
                 jp.setBackground(Color.yellow);
            } 
        }     
    }
}
}



実行結果
プログラムを起動した状態の画面です。
Greenボタンにfocusがあり、
Enterを押した場合。

コンソールにPressed Enterと表示されます。
Yellowボタンにfocusがあり、
Enterを押した場合。

コンソールにPressed Enterと表示されます。


keyTyped() method
EnterKeyではkeyTyped()メソッドは呼び出されません。文字入力があった場合に呼び出されます。
sampleでは記述していません。

keyPressed() method
ユーザーがキーを押すと呼び出され、何が押されたかの情報をKeyEventクラスのgetKeyCode()メソッドで入手します。

keyReleased() method
ユーザーがキーを放すと呼び出されますが、sampleでは記述していません。