ListenerとAdapter

 

プログラムには、決まり事と言いますか、定形文というのがあるので
最初のうちは悩まずに「おまじない」として使うのをお勧めします。

毎度、管理人イガジーです。

イガジーが最初に覚えた「おまじない」は、 Frame f=new Frame()
に続く、「閉じるボタンで終了する」文です。

f.addWindowListener(new WindowAdapter(){
	public void windowClosing(WindowEvent ev) {
		System.exit(0);
	}
});

addするのは「WindowListener」なのに
new しているのは「WindowAdapter」なので、何だか変に感じました。
でも、悩んでも仕方がないし、これを書けば(理屈は不明でも)
[X]ボタンで終了させる事ができるので、ともかく使うことから始めたわけです。

Javaにだいぶ慣れてから、
・Listenerは、決められたメソッドを全て書き下す必要がある
・Adapterは、自分が使うものだけ書けばよい
という違いがあることを知りました。

正確には、決められたメソッドを全て含んだものがAdapterとして
提供されている(そのメソッドは全て空)なので、
自分で必要なものだけextendsすれば良いのだ。と分かるには
さらに時間が必要でした。

次のプログラムが理解できれば、ListenerとAdapterが分かった
(+extendsも理解した)と言えるのではないかと思います。

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class WListeners {

	Frame f1,f2;

	WListeners(){ // constructor
		f1=new Frame();
		f1.addWindowListener(new WinAdp());
		f1.setTitle("Frame1");

		Button b1=new Button("End1");
		b1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		});
		f1.add(b1,BorderLayout.SOUTH);
		f1.setBounds(50,50,200,200);
		f1.setVisible(true);

		f2=new Frame();
		f2.addWindowListener(new MyWAdp());
		f2.setTitle("Frame2");

		Button b2=new Button("End2");
		b2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		});
		f2.add(b2,BorderLayout.SOUTH);
		f2.setBounds(250,50,200,200);
		f2.setVisible(true);
	}
	public static void main(String[] args) {
		new WListeners();
	}
}

class WinAdp implements WindowListener {

	public void windowActivated(WindowEvent e) {
		System.out.println("1.Activated");
	}
	public void windowClosed(WindowEvent e) {
		System.out.println("2.Closed");
	}
	public void windowClosing(WindowEvent e) {
		System.out.println("3.Closing");
	}
	public void windowDeactivated(WindowEvent e) {
		System.out.println("4.Deactivated");
	}
	public void windowDeiconified(WindowEvent e) {
		System.out.println("5.Deiconified");
	}
	public void windowIconified(WindowEvent e) {
		System.out.println("6.Iconified");
	}
	public void windowOpened(WindowEvent e) {
		System.out.println("7.Opened");
	}
}

class MyWAdp extends WinAdp {
	public void windowClosing(WindowEvent e) {
		System.out.println("!Closing!");
	}
}

Frame f1の方は、
class WinAdp implements WindowListener {…}で
全てのメソッドを実装したものを add しています。

Frame f2の方は、
WinAdpを extends した MyWAdp を add しています。

実際は、WinAdpの代わりに、WindowAdapter が(全て空メソッドで)
提供されているのです。(故にWinAdpの様なものは書かなくて済む。)

でも、いきなりは理解しにくいと思うので、慣れるしかないでしょう。
(というのは、説明が下手な言い訳かもしれませんが ^^; )

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)