"/"と"\"のキーはキーボードでは並んでいます。マウスでボタンをクリックするよりも2本の指で操作する方が微妙なタイミングを逃さずにできるかもしれません。
キーの押し下げをイベントとして取り込むことに挑戦しましょう。
KeyListnerが使えます。ActionListenerと同様な使い方です。ただし@Overrideするメソッドは3つです。
リスナー | 必要なメソッド |
---|---|
ActionListener | actionPerformed |
KeyListener | keyPressed keyReleased keyTyped |
keyPressedはキーが押された時、keyReleasedはキーが放された時、keyTypedは文字と判断できる入力があった時に呼び出されます。actionPerformedと同様に考えてください。
まず、class ABall7 にKeyListenerの機能をもたせます。
public class ABall7 extends JFrame implements ActionListener,KeyListener{
ActionListenerとKeyListenerの両方の機能をもたせるのでimplementsの後ろにActionListenerとKeyListenerをコンマで区切って書きます。
次にaddKeyListener()でキーにイベントの監視人をつけます。
rbtn.addActionListener(this); gbtn.addActionListener(this); bbtn.addActionListener(this); rbtn.addKeyListener(this); gbtn.addKeyListener(this); bbtn.addKeyListener(this); pack();
KeyListenerはいろいろなものに取り付けられますが、その時にフォーカスのある部品にイベントを伝えます。ボタンやテキストフィールドがあるフレームでは自動的にその最初のものにフォーカスが行きます。ABall7.javaでは必ず3つのボタンのどれかにフォーカスがありますので、どれにフォーカスがある時でもイベントを捕まえられるようにこの3つにリスナを取り付けなければなりません。
actionPerformed()に相当するのは3つあって、今回はkeyPressedのみを使います。使わないものも下記のように書いておく必要があります。
KeyEvent e からコードを取り出します。このコードは文字コードではありません。VKで始まる名前で指定できるようになっています。キーボードが異なってもすべてのキーに対応するコードがあるかは微妙です。ここで使うのは Enter, /, \ の3つです。
actionPerformed()メソッドの後に下記の全部を加えます。
@Override public void keyPressed(KeyEvent e){ if ( e.getKeyCode() == KeyEvent.VK_ENTER ){ rbtn.doClick(); } if ( e.getKeyCode() == KeyEvent.VK_SLASH ){ mypnl.greenct++; } if ( e.getKeyCode() == KeyEvent.VK_BACK_SLASH ){ mypnl.bluect++; } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { }
上記の様に働くようにし、動作を確認しなさい。