キーボードも使う

KeyListner

"/"と"\"のキーはキーボードでは並んでいます。マウスでボタンをクリックするよりも2本の指で操作する方が微妙なタイミングを逃さずにできるかもしれません。

キーの押し下げをイベントとして取り込むことに挑戦しましょう。

KeyListnerが使えます。ActionListenerと同様な使い方です。ただし@Overrideするメソッドは3つです。

リスナー必要なメソッド
ActionListeneractionPerformed
KeyListenerkeyPressed keyReleased keyTyped

keyPressedはキーが押された時、keyReleasedはキーが放された時、keyTypedは文字と判断できる入力があった時に呼び出されます。actionPerformedと同様に考えてください。

KeyListnerの取り付け

まず、class ABall7 にKeyListenerの機能をもたせます。

ファイル名 ABall7.java の一部

public class ABall7 extends JFrame implements ActionListener,KeyListener{

ActionListenerとKeyListenerの両方の機能をもたせるのでimplementsの後ろにActionListenerとKeyListenerをコンマで区切って書きます。

次にaddKeyListener()でキーにイベントの監視人をつけます。

ファイル名 ABall7.java の一部

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つあって、今回はkeyReleasedのみを使います。使わないものも下記のように書いておく必要があります。

KeyEvent e からコードを取り出します。このコードは文字コードではありません。VKで始まる名前で指定できるようになっています。キーボードが異なってもすべてのキーに対応するコードがあるかは微妙です。ここで使うのは Enter, /, \ の3つです。

VK_ENTER
rbtnを押したことにします。rbtn.doClick()でこれが実現できるのは嬉しい限りです。
VK_SLASH
greenボタンと同じくgreenctに1を加えるだけでいいでしょう
VK_BACK_SLASH
blueボタンと同じくbluectに1を加えるだけでいいでしょう

ファイル名 ABall7.java の一部

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

課題

1.

上記の様に働くようにし、動作を確認しなさい。

ファイル名 ABall7.java


Javaプログラミング
聖愛中学高等学校
http://www.seiai.ed.jp/
Nov.2012