libro
www.tuyano.com
初心者のためのJava SEプログラミング入門

イベントとイベントリスナー (4/4)

作成:2010-01-14 14:21
更新:2011-10-11 15:22

■リスナークラスをクラス内に持ってくる

これで、一応はイベント処理ができるようになりました。が、まだまだ考えないといけないことはあります。

例として、さっきのTest5を改良して、「ボタンをクリックしたら、Labelのテキストを変える」というものを考えてみましょう。――なーんだ、たったそれだけか、それならClickActionactionPerformedを修正すればすむじゃないか。そう思うでしょう。
class ClickAction implements 
    ActionListener {

  public void actionPerformed(ActionEvent ev){
    mylabel.setText("You are clicked!");
  }

}
まあ、ざっとこんな感じですね。――ところが、これをコンパイルすると、エラーが起きるはずです。「mylabelって変数がわからない」といわれます。

実をいえば、変数というのは「有効利用範囲」というのが決まっているのです。つまり「この変数はどこからどこまで使えるか」というものですね。基本的に、メソッドの中で宣言された変数は、そのメソッドを抜けると消えてしまいます。

クラス(っていうより、インスタンス)の中でずっと使えるような変数も作れるんですが、それはClickActionのように、全く無関係のクラスのインスタンスから利用するのは難しいのです。だって、ClickActionの中から、どうやって「さっき作ったTest5インスタンスの中にある変数」を取り出せばいいんです? ちょっと考えただけでも難しそうでしょう?

そこで、ちょっとだけひねったテクニックを使ってやります。「ClickActionクラスを、Test5クラスの中に入れてしまう」のです。実際にやってみましょう。

下のリストのようにソースコードを修正して、コンパイルして実行してみて下さい。ボタンをクリックすると、Labelのテキストが変わりますよ。

クラスというのは、実はこんな具合に「クラスのまたクラスを作る」ということもできるんです。こうすると、内側のクラスは、外側のクラスの一部として作られますから、クラス内にある部品などをそのまま使うことができます。

こうした「クラスの内側にあるクラス」のことを「内部クラス」と呼んだりします。リスナー作成のテクニックとして覚えておきましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

import java.awt.*;
import java.awt.event.*;


public class Test5 extends Frame {
	Label mylabel;
	Button mybutton;


	public Test5() {
		super();
		setTitle("Hello");
		setSize(300,150);
		setLayout(null);
		
		mylabel = new Label("Hello World.");
		mylabel.setBounds(50,50,200,30);
		this.add(mylabel);
		
		mybutton = new Button("OK");
		mybutton.setBounds(100,100,100,25);
		this.add(mybutton);
		
		mybutton.addActionListener(new ClickAction());
	}

	 public static void main (String args []) {
		new Test5().setVisible(true);
	}

	class ClickAction implements ActionListener {

		public void actionPerformed(ActionEvent ev){
			mylabel.setText("You are clicked!");
		}

	}

}

※関連コンテンツ

「初心者のためのJava SEプログラミング入門」に戻る