Code is beautiful

2009-07-20

複数ボタンの処理など

複数のテキストボタンを作成して、押したら"Clicked!"に変更。

"All Clear"を押すと全てのボタンを消去する。

http://good-morning-world.com/swf/txtbutton/



テキストボタンを作るにはマウスイベント用にSpriteと組み合わせて作る。

複数作る効率を考えて配列を使用。ボタン毎にaddEventListenerも効率悪い感じなのでforループで記述してみた。

また、addEventListenerに引数を指定できたら良いなと思ってたんだけど、

btn.addEventListener(MouseEvent.Click, onMouseClick(引数));
function onMouseClick(引数):Function {
	return function(event:MouseEvent):void {
		// 処理
	}
}

な書き方でいけるらしい。

txtbutton.as

package 
{
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;
	
	[SWF(width = 400, height = 300)]
	public class txtbutton extends Sprite {
		private var tfld:Array = new Array(5);
		public function txtbutton() {
			var txt:Array = new Array("Button1", "Button2", "Button3", "Button4", "All Clear");
			var btn:Array = new Array(5);
			
			var bx:int = 10;
			var by:int = 10;
			
			for (var i:int = 0; i < 5; i++) {
				btn[i] = new Sprite();
				btn[i].buttonMode = true;		// ボタンとして動作させる
				btn[i].x = bx;
				btn[i].y = by;
				
				tfld[i] = new TextField();
				tfld[i].text = txt[i];
				tfld[i].autoSize = TextFieldAutoSize.LEFT;
				tfld[i].mouseEnabled = false;	// マウスイベントを受け取らない
				
				addChild(btn[i]);
				btn[i].addChild(tfld[i]);
				
				btn[i].addEventListener(MouseEvent.Click, onMouseClick(i));
				by += 20;
			}
		}
		
		private function onMouseClick(i:int):Function {
			return function(event:MouseEvent):void {
				if (i == 4) {
					while (numChildren > 0) {
						removeChildAt(0);
					}
				} else {
					tfld[i].text = "Clicked!";
				}
			}
		}
	}
}

参考:

テキストフィールドをボタン処理させる時に気をつける「mouseEnabled」 - 1ka2ka.com

http://1ka2ka.com/archives/200807/23_215215.html


addEventListenerで一緒に引数を渡したい | BONKURA BLOG

http://blog2.bonkura.jp/?p=13

flamemo: MC以下のすべての Child を removeChild() したい

http://flamemo.blogspot.com/2009/04/mc-child-removechild.html

トラックバック - http://d.hatena.ne.jp/H6K/20090720/p1