イベント処理と Listener,Adapter

新しいイベントモデルの中心になる Listenerインターフェイス と Adapterクラスについて 具体例で解説します。
Listener のインターフェイス群は、イベント処理を可能にする機能を提供します。 すべての Listener は java.util パッケージに含まれる EventListener を共通のスーパークラスに持ちます。 実際のプログラムの中で用いられる Listener は java.awt.event パッケージに 含まれ、以下の表のものがあります。

java.awt.event の Listener インターフェイスとその意味
インターフェイス名 対応するAdapterクラス 働き 受け取るイベントのクラス 実装すべきメソッド名
MouseListener MouseAdapter マウスの出入りやクリックのイベントを受け取る MouseEvent mouseClicked()
mouseEntered()
mouseExited()
mousePressed()
mouseReleased()
MouseMotionListener MouseMotionAdapter マウスの移動、ドラッグのイベントを受け取る MouseEvent mouseMoved()
mouseDragged()
KeyListener KeyAdapter キー入力のイベントを受け取る KeyEvent keyPressed()
keyReleased()
keyTyped()
FocusListener FocusAdapter キーボードフォーカスの移動のイベントを受け取る FocusEvent focusGained()
focusLost()
WindowListener WindowAdapter ウィンドウの表示、クローズ、消去のイベントを受け取る WindowEvent windowClosed()
windowClosing()
windowDeiconified()
windowIconified()
windowOpened()
ComponentListener ComponentAdapter コンポーネントの表示やレイアウト変更のイベントを受け取る ComponentEvent componentHidden()
componentShown()
componentMoved()
componentResized()
ContainerListener ContainerAdapter Containerへのオブジェクトの追加・削除のイベントを受け取る ContainertextEvent componentAdded()
componentRemoved()
ActionListener なし Buttonのクリックなどのアクションを受け取る ActionEvent actionPerformed()
ItemListener なし Checkbox などの状態の変更のアクションを受け取る ItemEvent itemStateChanged()
TextListener なし TextArea,TextField の入力のアクションを受け取る TextEvent textValueChanged()
AdjustmentListener なし スクロールバーなどの操作のイベントを受け取る AdjustmentEvent adjustmentValueChanged()

イベントが発生したコンポーネントは 何らかの方法で、そのことを処理を担当するクラスに伝える必要があります。 そのために Componentクラス(それを継承したApplet)には、 新たに Listener(を実装したオブジェクト) を登録する(および登録を削除する)ためのメソッドが追加されています。

また、Componentのサブクラスのコンポーネントでも そのクラスが扱うべきイベント(アクション)に対応する 呼び出しを登録するためのメソッドが定義されています。

また、TextFieldやListなどは、ActionListenerも登録もしくは削除できる仕組みに なっています。つまり複数の種類のアクションに対応しているということです。 たとえば TextFiledの場合、1文字ごとの入力が行われるたびに TextEventが 発生し、TextListenerに対応する textValueChanged()が呼び出されます。 そしてリターンキーが入力されると ActionEventが発生し、ActionListenerに 対応する actionPerformed()が呼び出されます。処理の目的に応じて使い分け が可能です。 Listの場合は、特定の選択項目をダブルクリックした時に ActionEventが発生します。
これも一覧表にしてまとめておきましょう。

java.awtのコンポーネントが登録できる Listener
Component名 Listener名
Button ActionListener
Checkbox ItemListener
Choice ItemListener
List ItemListener, ActionListener
TextField TextListener, ActionListener
TextField TextListener
Scrollbar AdjustmentListener

イベント処理を行うには上のメソッドをどこかで一度呼び出しておく必要が あります。アプレットの場合なら、init()メソッドの中が適当でしょう。

Listenerはコンポーネントの機能を分離して別のクラスに組み込むことを 本来の目的としています。 しかし、コンポーネントのクラスにイベント処理を行わせてもかまいません。 たとえばアプレットのクラスの中で処理を完結させたいような場合には、 次のようにすることも可能です。


public class NewApplet extends Applet implements MouseListener {

    public void init(){

           addMouseListener( this ); // 自分自身を登録
                      :
                      :

Adapterクラス群は、それぞれの対応する Listenerのメソッドを 形式的に実装したクラスです。 Adapterの各クラスはすべて Objectクラスの直接のサブクラスで、 何か特別な機能があるわけではありません。 原理的には、Adapterクラスは使用しないでも Listenerのメソッドを 直接実装すれば同じことですが、 Adapterクラスを継承する形でイベント処理専用のクラスを設計すれば、 プログラムの記述が簡潔になり見やすくなります。
Listener を直接実装しても、Adapterクラスを継承しても、 addMouseListener()のようなメソッドを使う点は変わりません。 addMouseAdapter()のようなメソッドがあるわけではありません。