アクションリスナーの仕組み


ボタンをクリックしたときに発生するイベントは「アクションイベント」と呼ばれるものです。アクションイベントは、「アクションリスナー」と呼ばれるイベントリスナーによって処理されます。では、ここで用意しているアクションリスナーのクラスがどうなっているか見てみましょう。
class クラス名 implements ActionListener {

  public void actionPerformed(ActionEvent ev){
    ・・・実行する処理・・・
  }
}

こんな形になっていることがわかるでしょう。アクションリスナーは、java.awt.eventパッケージに「ActionListener」という名前で用意されています。ただし、これは一般的なクラスとはちょっと違うものだ、という点に注しましょう。このActionListenerは「インターフェイス」と呼ばれるものなのです。インターフェイスというのは「さまざまな定義だけを用意した特殊なクラス」とでもいえばよいでしょうか。あらかじめ「このクラスにはこういうメソッドを用意しないといけない」といった定義をしたものです。

このインターフェイスがどういうものか、今ここで正確に理解する必要はありません。知っておきたいのは「インターフェイスは、さまざまな機能をクラスに追加するのに用いられる」ということです。例えば、あるクラスにActionListenerというインターフェイスを組み込むと、そのクラスはActionListenerとしての機能を持つようになるわけです。このインターフェイスを組み込むには、クラスの定義の際に「implements」というものを使ってインターフェイス名を指定してやります。

インターフェイスを組み込んだクラスでは、そのインターフェイスに用意されているメソッドを必ず用意しないといけません。例えば、ActionListenerには「actionPerformed」というメソッドが用意されています。implements ActionListenerしたクラスでは、必ずこのメソッドを用意しないといけないのです。このactionPerformedというメソッドが、アクションイベントが発生したときに呼び出されるものです。つまり、ここに必要な処理を記述すれば、アクションイベントが発生すると実行されるようになるというわけです。

では、こうして用意したアクションリスナーは、どうやって組み込めばいいんでしょう。それは、Sampleクラスのコンストラクタ部分を見ればわかります。
button1.addActionListener(new ActionAdapter());

これがその部分です。「addActionListener」というメソッドが、ActionListenerをbutton1に組み込んでいる部分です。作成したActionAdapterのインスタンスを引数にしていしているのがわかりますね。

これで、button1をクリックしてアクションイベントが発生すると、これに組み込まれているActionAdapterインスタンス内のactionPerformedメソッドが実行されるようになります。

では、基本的な流れがわかったところで、actionPerformed内でコンポーネントを操作する処理をさせてみましょう。JTextFieldやJLabelといったテキスト関係のコンポーネントでは、以下のようなメソッドで表示テキストを操作することができます。
String 変数 = コンポーネント.getText();
コンポーネント.setText( String値 );

では、JTextFieldのテキストを取り出してJLabelに設定するにはどうすればよいでしょうか。おそらく、誰もが考えるのは以下のようなやりかたでしょう。(actionPerformedメソッドだけをあげておきます)
  public void actionPerformed(ActionEvent ev){
    String s = field1.getText();
    label1.setText(s + "と書きました。");
  }
コンパイルするとエラーメッセージが現れコンパイルできません。

ところが、実際に先ほどのリストをこのように書き換えてみると、エラーが発生して動かないことがわかります。これはいったい、どういうことでしょう?