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の様なものは書かなくて済む。)
でも、いきなりは理解しにくいと思うので、慣れるしかないでしょう。
(というのは、説明が下手な言い訳かもしれませんが ^^; )
この記事へのコメントはこちら