ActionListenerの書き方いろいろ

 

プログラムの書き方には、色々なスタイルがあるのですが、
どれが正しいと言うよりは、単に「好み」の問題です。

毎度、イガジーです。

Buttonを押した時の処理の「ActionListener」の書き方も
3通りほどあり、どれを使うか、は人それぞれです。
(書き方の違いだけで、動作は同じです。)

次に簡単な例を書いてみました。

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Listeners {
	Frame f0;
	Label lbl=new Label();

	Listeners() {
		f0=new Frame();
		f0.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev) {
                System.exit(0);
            }
        });
		Panel p=new Panel();

		Button btn1=new Button("addAL");
		btn1.addActionListener(new MyAL());
		p.add(btn1);

		Button btn2=new Button("no Name");
		btn2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// System.out.println("no Name");
				lbl.setText("no Name");
			}
		});
		p.add(btn2);

		Button btn3=new MyButton("extend");
		p.add(btn3);


		lbl.setFont(new Font(Font.SANS_SERIF, Font.PLAIN,24));
		lbl.setAlignment(Label.CENTER);
		f0.add(lbl,BorderLayout.CENTER);
		f0.add(p,BorderLayout.SOUTH);

		f0.setSize(360,160);
		f0.setVisible(true);
	}
	public static void main(String[] args) {
		new Listeners();
	}

	class MyAL implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			// System.out.println("add ActionListenr");
			lbl.setText("Add ActionListener");
		}
	}
	class MyButton extends Button implements ActionListener {
		private static final long serialVersionUID = 1L;
		MyButton(String lb) {
			super(lb);
			this.addActionListener(this);
		}
		@Override
		public void actionPerformed(ActionEvent arg0) {
			//System.out.println("extends Button");
			lbl.setText("extends");
		}
	}
}

最初のbtn1が、ActionListenerを含むクラスを明示的に作る書き方です。
2番目のbtn2は、クラス名を書く所に直接その内容を書き下したもので
無名クラスと呼ばれます。
3番目は、ActionListenerを内包するクラスを作ってしまうものです。

これらは、ActionListenerだけでなく、ItemListenerや
WindowListenerなど、Listenerと名のついているものに対して
同じ書き方ができます。

感覚的な話になりますが、処理の短いものは無名クラスにしてしまう事が
多いと思います。

※ 3パターンも覚えたくないという方は、最初の形だけ覚えれば十分です。
※※ 覚えるというより、こういうのはコピペするとか、Eclipseに補完させれば良いのです。

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

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

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

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