Event処理

次は、ユーザの操作に応じて、画面が変化するようにしてみましょう。

  • ボタンを押したら,下のTextField に “Button Pressed!” と表示がでる。
  • 上の TextField に文字を入力後リターンボタンを押すと、下のTextField に “Echo: “という文字とともに、その内容が表示される。

Simple1の絵

こういった処理を行うためには、

  • GUIイベントの処理の方法を登録しておき、
  • システムが指定されたイベントを見つけたら、その処理ルーチンを呼んでもらう

必要があります。そう、インターフェイスの出番です。

まずは、プログラムを見てもらいましょうか。プログラムは、以下のとおり。

Simple1 改修部分

void initialize() {
    //...省略
    
    /*** ここから追加部分 ***/
    text1.setEditable(false);  // text1 をユーザ編集不可に
    // event listener をボタンと text0 に付加
    button.addActionListener(new MyButtonListener(this)); 
    text0.addActionListener(new MyTextFieldListener(this));
}
public void echoButton() { // ボタンが押されたことを、text1に表示
    text1.setText("Button Pressed!");
}
public void echoText() {   // text0 の内容を text1 に表示
    text1.setText("Echo: " + text0.getText());
}

ポイント

  • JButtonJTextField といった部品に対し、イベントリスナを登録している。
  • 実際のボタンやテキスト入力を受けたときの処理は、echoButton(), echoText() というメソッドとして、Sample1 クラスに作成済み。
  • つまり、イベントリスナがすべきは、イベントが起きた際によばれ、echoButton() なり echoText() を呼ぶことだけ
public class MyButtonListener implements ActionListener {
    private Simple1 simple1;

    public MyButtonListener(Simple1 simple1) {
        this.simple1 = simple1;
    }
    public void actionPerformed(ActionEvent arg0) {
        simple1.echoButton();
    }
}

ポイント

  • java.awt.event.ActionListener というインタフェイスを実装。
  • イベント処理内容は、actionPerformed(ActionEvent e) に記載。
    • イベントの中身は e にアクセスすることで取得可能。
  • 今回は、イベントが起きたら、echoButton() を呼んでいるだけ。
  • だた、こういうクラスをそれぞれつくっていたら大変なので、anonymousInnerclass や lambda expression を使うことが最近は多いです。